国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Docker容器學習梳理--應用程序容器環(huán)境部署

關于國內(nèi)Docker鏡像,可以參考:Docker容器學習梳理--基礎知識(2) 的Docker鏡像使用。

如果我們需要在Docker環(huán)境下部署tomcat、redis、mysql、nginx、php等應用服務環(huán)境,有下面三種方法:

1
2
3
4
5
6
7
8
9
10
11
1)根據(jù)系統(tǒng)鏡像創(chuàng)建Docker容器,這時容器就相當于是一個虛擬機,進入容器內(nèi)部署應用環(huán)境。
   然后將這種應用容器提交為新的鏡像,最后基于這種新的應用鏡像創(chuàng)建容器,創(chuàng)建時做好端口映射,就可以在外部訪問這些應用了。
2)直接通過docker pull拉取別人提交好的tomcat、nginx等應用程序鏡像,然后基于這些鏡像去創(chuàng)建容器。
3)通過dockerfile制作自己的應用程序鏡像。
根據(jù)系統(tǒng)鏡像部署應用容器,簡單做法如下:
1)啟動centos系統(tǒng)鏡像的容器my_container
2)在my_container容器里部署例如nginx、php、mysql、php的服務
3)將部署完對應服務的容器my_container提交為新的鏡像
4)然后根據(jù)新鏡像去創(chuàng)建容器
5)這個新鏡像可以打包,導入到別的Docker服務器上使用

啟動容器時,記得要做好端口映射和目錄映射。端口映射是為了實現(xiàn)在外部能成功訪問到容器里的應用服務。目錄映射是為了實現(xiàn)宿主機和容器的數(shù)據(jù)共享,這樣要對容器做修改時,直接在宿主機的映射目錄下做修改就行。修改數(shù)據(jù)的操作最好不要在容器內(nèi)進行原則上來說一個應用啟動一個容器,最好別在一個容器內(nèi)啟動多個應用。

下面列舉幾個通過應用服務鏡像部署環(huán)境的例子:
Docker宿主機內(nèi)網(wǎng)ip:192.168.1.23
Docker宿主機外網(wǎng)ip:103.110.186.23
Docker部分命令解釋:

1
2
3
4
5
6
7
-i:表示以“交互模式”運行容器
-t:表示容器啟動后會進入其命令行。加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端。
--name :表示創(chuàng)建的容器名為my-nginx
-v:表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。
    注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。
-d:在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i -t兩個參數(shù),創(chuàng)建后就會自動進去容器)。docker attch登錄容器時如果卡著,按ctrl+c。
-p:表示端口映射,前者是宿主機端口,后者是容器內(nèi)的映射端口。可以使用多個-p做多個端口映射

如果創(chuàng)建容器時報如下錯:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker: Error response from daemon: failed to create endpoint mosredis on network bridge: iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.6  -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1).
解決辦法:
一般來說,重啟docker服務,即可解決這個問題。
[root@localhost ~]# systemctl restart docker
[root@localhost ~]#
----------------------------------
如果重啟docker服務解決不了,那么如下操作:
[root@localhost ~]# pkill docker
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# ifconfig docker0 down
[root@localhost ~]# brctl delbr docker0

一、redis容器環(huán)境部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
拉取redis鏡像(這里拉取的是官方鏡像。也可以自己制作redis鏡像)
[root@localhost ~]# docker pull redis
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB
  
用下面的命令啟動Redis容器,記得要帶上“-d”參數(shù).在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行。
[root@localhost ~]# docker run --name myredis -d docker.io/redis
7a273a550005b8494be9d48970a6cc4efbaddd8a152261310a07237d43c9eb16
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7a273a550005        docker.io/redis     "docker-entrypoint.sh"   3 seconds ago       Up 2 seconds        6379/tcp            myredis
  
連接容器的redis
1)第一種方式:找出容器的ip
[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 7a273a550005
172.17.0.2
  
然后連接容器的redis
[root@localhost ~]# redis-cli -h 172.17.0.2 -p 6379
redis 172.17.0.2:6379> ping      //驗證下redis服務是否已經(jīng)連接上
PONG
redis 172.17.0.2:6379>
2)第二種方式:
[root@localhost ~]# docker run --name myredis -d docker.io/redis
5e260566925e9d6a31b47a47124feb10f3dcfce131c6aa67647881da7874502b
     
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5e260566925e        docker.io/redis     "docker-entrypoint.sh"   13 minutes ago      Up 13 minutes       6379/tcp            myredis
     
下面的命令表示新建一個容器(命名為myredis2),將redis-cli運行在里面。然后使用--link將這個容器和之前的redis容器(myredis)連接起來,并將其別名命名為redisdb。
Docker會在redis容器中的/etc/hosts路徑下為"redisdb"創(chuàng)建一個入口,并指向redis容器的IP地址.
這樣在這兩個容器里就可以使用“redisdb”來作為提供redis容器的機器名,也就可以利用這個別名來連接容器redis。
[root@localhost ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash
root@4d4b25678b84:/data# redis-cli -h redisdb -p 6379
redisdb:6379> ping
PONG
redisdb:6379>
     
-----------------------------------------------------
當然,這樣也可以如上面先查容器ip進行連接
[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5e260566925e
172.17.0.2
[root@localhost ~]# redis-cli -h 172.17.0.2 -p 6379
redis 172.17.0.2:6379>
3)第三種方式:通過端口映射,外部連接redis容器應用的方法
創(chuàng)建Redis容器實例,這里使用了Docker的端口映射機制,從而就可以使用Host服務器的IP訪問這些redis實例.
如下創(chuàng)建三個redis容器實例
[root@localhost ~]# docker run -d --name node1 -p 7001:6379 docker.io/redis
e4b8ca12d9e76441efe2074ab1109757a33a45aff71d1a553140d48d88133372
[root@localhost ~]# docker run -d --name node2 -p 7002:6379 docker.io/redis
a8ee6f48f431651a0342fba289604046cd5b142f53a7eb43f655dde397a06a6f
[root@localhost ~]# docker run -d --name node3 -p 7003:6379 docker.io/redis
2b61bf6765a8c254df9dd41d3ece6b12f4dd768976e6e22f327516063fc2e634
[root@localhost ~]#
  
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
2b61bf6765a8        docker.io/redis     "docker-entrypoint.sh"   48 seconds ago       Up 47 seconds       0.0.0.0:7003->6379/tcp   node3
a8ee6f48f431        docker.io/redis     "docker-entrypoint.sh"   55 seconds ago       Up 55 seconds       0.0.0.0:7002->6379/tcp   node2
e4b8ca12d9e7        docker.io/redis     "docker-entrypoint.sh"   About a minute ago   Up About a minute   0.0.0.0:7001->6379/tcp   node1
  
在容器之間建立連接
可以創(chuàng)建應用程序容器,使用--link參數(shù)來創(chuàng)建一個連接redis容器,使用別名,將會在redis容器和redis實例容器中創(chuàng)建一個安全的通信隧道
  
------------node1操作------------
[root@localhost ~]# docker run --link node1:db -i -t docker.io/redis /bin/bash
root@8fd8d9db3cc1:/data#
  
現(xiàn)在可以測試連接,首先要先查看下web應用程序容器的環(huán)境變量,可以用我們的ip和端口來連接redis容器
root@8fd8d9db3cc1:/data# env | grep DB_
DB_PORT_6379_TCP_PORT=6379
DB_NAME=/nauseous_heisenberg/db
DB_PORT=tcp://172.17.0.2:6379
DB_PORT_6379_TCP=tcp://172.17.0.2:6379
DB_ENV_GOSU_VERSION=1.7
DB_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz
DB_ENV_REDIS_VERSION=3.2.8
DB_PORT_6379_TCP_ADDR=172.17.0.2
DB_PORT_6379_TCP_PROTO=tcp
DB_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f
  
可以看到上面命令結(jié)果中有一個DB為前綴的環(huán)境變量列表,DB來自指定別名連接對應的應用容器,這里就可以使用DB_PORT_6379_TCP_ADDR變量連接到Redis容器。
root@8fd8d9db3cc1:/data# redis-cli -h $DB_PORT_6379_TCP_ADDR
172.17.0.2:6379> ping
PONG
172.17.0.2:6379> set node1 redis-node1
OK
172.17.0.2:6379> get node1
"redis-node1"
172.17.0.2:6379>
  
------------node2操作------------
[root@localhost ~]# docker run --link node2:db2 -i -t docker.io/redis /bin/bash
root@8eb2ccc2aff3:/data# env | grep DB2_
DB2_PORT_6379_TCP_PROTO=tcp
DB2_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz
DB2_PORT_6379_TCP_ADDR=172.17.0.3
DB2_ENV_GOSU_VERSION=1.7
DB2_PORT=tcp://172.17.0.3:6379
DB2_PORT_6379_TCP_PORT=6379
DB2_ENV_REDIS_VERSION=3.2.8
DB2_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f
DB2_PORT_6379_TCP=tcp://172.17.0.3:6379
DB2_NAME=/furious_kare/db2
  
root@8eb2ccc2aff3:/data# redis-cli -h $DB2_PORT_6379_TCP_ADDR
172.17.0.3:6379> ping
PONG
172.17.0.3:6379> set node2 redis-node2
OK
172.17.0.3:6379> get node2
"redis-node2"
172.17.0.3:6379>
  
------------node3操作------------
[root@localhost ~]# docker run --link node3:db3 -i -t docker.io/redis /bin/bash
root@d60d074ca66b:/data# env|grep DB3_
DB3_PORT_6379_TCP_ADDR=172.17.0.4
DB3_PORT_6379_TCP_PORT=6379
DB3_PORT_6379_TCP_PROTO=tcp
DB3_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f
DB3_NAME=/amazing_kalam/db3
DB3_PORT=tcp://172.17.0.4:6379
DB3_ENV_REDIS_VERSION=3.2.8
DB3_ENV_GOSU_VERSION=1.7
DB3_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz
DB3_PORT_6379_TCP=tcp://172.17.0.4:6379
  
root@d60d074ca66b:/data# redis-cli -h $DB3_PORT_6379_TCP_ADDR
172.17.0.4:6379> ping
PONG
172.17.0.4:6379> set node3 redis-node3
OK
172.17.0.4:6379> get node3
"redis-node3"
172.17.0.4:6379>
  
這樣就可以在docker宿主機或其他服務器上通過宿主機的ip地址以及映射的端口進行連接
[root@localhost ~]# redis-cli -h 192.168.1.23 -p 7001
redis 192.168.1.23:7001> get node1
"redis-node1"
redis 192.168.1.23:7001>
  
[root@localhost ~]# redis-cli -h 192.168.1.23 -p 7002
redis 192.168.1.23:7002> get node2
"redis-node2"
redis 192.168.1.23:7002>
  
[root@localhost ~]# redis-cli -h 192.168.1.23 -p 7003
redis 192.168.1.23:7003> get node3
"redis-node3"
redis 192.168.1.23:7003>

注意一個細節(jié):
創(chuàng)建應用容器的時候,一般會做端口映射,這樣是為了讓外部能夠訪問這些容器里的應用??梢酝ㄟ^-P或-p參數(shù)來指定端口映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1)當使用-p標記時,可以指定端口映射,即容器端口映射到宿主機的對應端口。可以用多個-p指定多個端口映射關系。如下:
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB
[root@localhost ~]# docker run --name myredis -p 63799:6379 -d docker.io/redis
f5d5ff51ace01c5f26fcd65a6ca4853f8556a333c812576123ed71fd3d405737
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
f5d5ff51ace0        docker.io/redis     "docker-entrypoint.sh"   6 seconds ago       Up 5 seconds        0.0.0.0:63799->6379/tcp   myredis
[root@localhost ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash
root@16b660ff9f65:/data# redis-cli -h redisdb -p 6379
redisdb:6379> ping
PONG
redisdb:6379> set test linux
OK
redisdb:6379>
在別的機器上通過訪問本機的63799端口連接這個容器的redis
[root@linux-node2 ~]# redis-cli -h 192.168.1.23 -p 63799
192.168.1.23:63799> get test
"linux"
192.168.1.23:63799>
2)當使用-P標記時,Docker 會隨機映射一個 49000~49900 的端口到內(nèi)部容器開放的網(wǎng)絡端口。如下:
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB
[root@localhost ~]# docker run --name myredis -P -d docker.io/redis
805d0e21e531885aad61d3e82395210b50621f1991ec4b7f9a0e25c815cc0272
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
805d0e21e531        docker.io/redis     "docker-entrypoint.sh"   4 seconds ago       Up 3 seconds        0.0.0.0:32768->6379/tcp   myredis
從上面的結(jié)果中可以看出,本地主機的32768端口被映射到了redis容器的6379端口上,也就是說訪問本機的32768端口即可訪問容器內(nèi)redis端口。
測試看下,登陸redis容器,隨意寫個數(shù)據(jù)
[root@localhost ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash
root@be44d955d6f4:/data# redis-cli -h redisdb -p 6379
redisdb:6379> set wangshibo huanqiu
OK
redisdb:6379>
在別的機器上通過上面映射的端口32768連接這個容器的redis
[root@linux-node2 ~]# redis-cli -h 192.168.1.23 -p 32768
192.168.1.23:32768> get wangshibo
"huanqiu"

二、nginx容器環(huán)境部署(下面是自己制作的應用鏡像)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
[root@linux-node2 ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos                       latest              67591570dd29        3 months ago        191.8 MB
為了防止centos7鏡像容器里出現(xiàn):Failed to get D-Bus connection: Operation not permitted 這個bug錯誤,需要在啟動容器的時候添加--privileged參數(shù)
并且后面登錄容器執(zhí)行的命令是/sbin/init,如下:
[root@linux-node2 ~]# docker run --privileged -t -i centos /sbin/init
上面命令執(zhí)行后,會一直卡著。這個不要緊,再打開一個終端窗口,查看并登錄容器:
[root@linux-node2 ~]# docker ps
CONTAINER ID    IMAGE       COMMAND        CREATED          STATUS         PORTS  NAMES
eaf66f1e43ab    centos      "/sbin/init"   16 seconds ago   Up 15 seconds         hungry_khorana
[root@linux-node2 ~]# docker exec -it eaf66f1e43ab /bin/bash
[root@eaf66f1e43ab /]#
接著在容器里安裝nginx
[root@eaf66f1e43ab /]# yum install -y wget lsof vim
添加CentOS 7 Nginx yum資源庫,然后安裝nginx
[root@eaf66f1e43ab /]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@eaf66f1e43ab /]# yum install -y nginx
[root@eaf66f1e43ab conf.d]# pwd
/etc/nginx/conf.d
[root@eaf66f1e43ab conf.d]# cat test.conf
server {
listen 8080;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}
[root@eaf66f1e43ab conf.d]# mkdir -p /var/www/html
[root@eaf66f1e43ab conf.d]# cat /var/www/html/test.html
this is nginx page of docker!!
[root@eaf66f1e43ab conf.d]# systemctl start nginx.service
將這個容器提交為新的鏡像
[root@linux-node2 ~]# docker stop eaf66f1e43ab
[root@linux-node2 ~]# docker commit eaf66f1e43ab my-nginx
[root@linux-node2 ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
my-nginx                     latest              8dacda904e00        45 minutes ago      314.4 MB
將上面提交的鏡像打包
[root@linux-node2 ~]# docker save my-nginx > /root/my-nginx.tar.gz
然后將這個鏡像包上傳到別的機器上,比如上傳到192.168.1.23機器上的/root下。
在192.168.1.23機器上導入新鏡像
[root@localhost ~]# docker load < /root/my-nginx.tar.gz
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-nginx            latest              8dacda904e00        50 minutes ago      314.4 MB
啟動nginx容器
[root@localhost ~]# docker run -t -i --privileged --name nginx -v /var/www/html:/var/www/html -p 8899:8080 my-nginx /sbin/init
上面命令執(zhí)行后會卡著,在另一個端口窗口:
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
3b5cbea50052        my-nginx            "/sbin/init"        36 seconds ago      Up 35 seconds       0.0.0.0:8899->8080/tcp   nginx
[root@localhost ~]# docker exec -t -i 3b5cbea50052 /bin/bash
[root@3b5cbea50052 /]#
[root@3b5cbea50052 /]# systemctl start nginx.service
[root@3b5cbea50052 /]# ps -ef|grep nginx
root       117     1  0 16:47 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      118   117  0 16:47 ?        00:00:00 nginx: worker process
root       120    88  0 16:47 ?        00:00:00 grep --color=auto nginx
[root@3b5cbea50052 /]# cat /etc/nginx/conf.d/test.conf
server {
listen 8080;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}
[root@3b5cbea50052 /]# cat /etc/nginx/conf.d/test.conf
server {
listen 8080;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}
[root@localhost ~]# cat /var/www/html/index.html
this is page of Docker-nginx-test!!!
Docker宿主機的iptables防火墻設置好映射端口8899

測試訪問

----------------------------------------------------------------------------
根據(jù)nginx應用鏡像直接創(chuàng)建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
[root@localhost ~]# docker pull nginx
[root@localhost ~]# docker images
docker.io/nginx                latest              5e69fe4b3c31        4 days ago          182.5 MB
[root@localhost ~]# docker run -ti -d --name my-nginx -p 9988:80 docker.io/nginx /bin/bash
55ae1f2b1eca6638e11865171f322a55cfa277a0aec06526428a1887229b022e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                           NAMES
55ae1f2b1eca        docker.io/nginx             "/bin/bash"         3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:9988->80/tcp   my-nginx
[root@localhost ~]# docker exec -ti my-nginx /bin/bash
root@55ae1f2b1eca:/# find / -name nginx
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx
/usr/lib/x86_64-linux-gnu/perl5/5.20/auto/nginx
/usr/lib/nginx
/usr/sbin/nginx
/usr/share/doc/nginx
/usr/share/lintian/overrides/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx
root@55ae1f2b1eca:/# mkdir -p /var/web/www
root@55ae1f2b1eca:/# exit
exit
[root@localhost ~]# docker cp my-nginx:/etc/nginx /var/
[root@localhost ~]# mkdir -p /var/web/www
[root@localhost ~]# cd /var/web/www/
[root@localhost www]# echo "12313123" > index.html
[root@localhost ~]# docker stop my-nginx
my-nginx
[root@localhost ~]# docker rm my-nginx
my-nginx
[root@localhost ~]# docker run -ti -d --name my-nginx -v /var/nginx:/etc/nginx -v /var/web/www:/var/web/www -p 8899:80 docker.io/nginx /bin/bash
af8a4594d643197d204200cd1e3b6a3d000cae71ef92826c0e40edfa87026a2a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                           NAMES
af8a4594d643        docker.io/nginx             "/bin/bash"         52 seconds ago      Up 50 seconds       443/tcp, 0.0.0.0:8899->80/tcp   my-nginx
[root@localhost ~]# vim /etc/sysconfig/iptables
.......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8899 -j ACCEPT
[root@localhost ~]# systemctl restart iptables.service
[root@localhost ~]# docker exec -ti my-nginx /etc/init.d/nginx start
然后就可以通過訪問http://宿主機ip:8899,進而訪問到nginx容器應用了。
接著測試下
[root@localhost ~]# mv /var/nginx/conf.d/default.conf /var/nginx/conf.d/default.conf.bak
[root@localhost ~]# cat /var/nginx/conf.d/test.conf
server {
listen 80;
server_name localhost;
location / {
root /var/web/www;
index index.html;
}
}
[root@localhost ~]# echo "12312313" > /var/www/html/test.html
接著重啟容器的nginx應用
[root@localhost ~]# docker exec -t -i my-nginx /etc/init.d/nginx restart
測試訪問(192.168.1.23是宿主機ip)
[root@localhost ~]# curl http://192.168.1.23:8899/
12313123

可以使用Nginx+Docker實現(xiàn)負載均衡

1
2
3
4
5
6
1)在本機部署兩個nginx的docker容器,端口對應關系分別是8088:80、8089:80
2)在本機在安裝nginx,然后在nginx配置文件中使用upstream將訪問請求負載到本機的8088和8089端口上,
   這樣也就是將訪問請求負載到兩個容器上了
此方案的原理是將宿主機的端口和docker容器的端口做一個映射(即訪問宿主機的某端口會映射到docker容器對應的端口),
然后在宿主機通過配置Nginx,即可達到訪問宿主機的某端口,按規(guī)則分配到指定的服務地址,即完成了負載均衡。

三、tomcat容器環(huán)境部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@localhost ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
docker.io/centos     latest              67591570dd29        3 months ago         191.8 MB
[root@localhost ~]# docker run -it --name=container1 docker.io/centos
[root@9df6dc740f01 /]# java -version      //容器里安裝java
  
上傳宿主機的tomcat到容器里
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# ls
apache-tomcat-7.0.57.tar.gz
[root@localhost src]# docker cp apache-tomcat-7.0.57.tar.gz 9df6dc740f01:/usr/local/src/
  
登陸容器,安裝tomcat
[root@9df6dc740f01 /]# cd /usr/local/src/
[root@9df6dc740f01 src]# ls
apache-tomcat-7.0.57.tar.gz
[root@9df6dc740f01 src]# tar -zvxf apache-tomcat-7.0.57.tar.gz
[root@9df6dc740f01 src]# mv apache-tomcat-7.0.57 /usr/local/tomcat7
  
將此容器提交為新的鏡像
[root@localhost ~]# docker commit container1 tomcat7
sha256:2ec9e2eb978a4af266608fdfd70320bff0886b245a9a2d249cdefdfe70760acb
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat7             latest              2ec9e2eb978a        3 minutes ago       562.3 MB
[root@localhost ~]# docker stop container1
container1
[root@localhost ~]# docker rm container1
container1
  
利用新提交的鏡像啟動tomcat容器
[root@localhost ~]# docker run -t -i -d --name=tomcat -p 8888:8080 tomcat7 /bin/bash
25f20fa6d54a1b2e2454a4d0a3966854e2fe4d81c54c366a1b07da47695f5418
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
25f20fa6d54a        tomcat7             "/bin/bash"         3 seconds ago       Up 2 seconds        0.0.0.0:8888->8080/tcp   tomcat
  
登陸容器,啟動tomcat進程
[root@localhost ~]# docker attach tomcat
[root@25f20fa6d54a ~]# /usr/local/tomcat7/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat7
Using CATALINA_HOME:   /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
[root@25f20fa6d54a ~]# ps -ef|grep tomcat
root        62     1 92 07:52 ?        00:00:03 java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap start
root        84     1  0 07:52 ?        00:00:00 grep --color=auto tomcat

宿主機防火墻開通8888端口,然后就可以在外部容器的tomcat了(通過宿主機的8888端口進行映射)

1
2
3
4
[root@localhost ~]# vim /etc/sysconfig/iptables
.......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT
[root@localhost ~]# systemctl restart iptables.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
--------------------------------------------------------------------------------------------
在部署應用容器的時候,最好將容器的配置文件及數(shù)據(jù)目錄跟宿主機目錄做個映射關系!最好不要在容器內(nèi)修改數(shù)據(jù)。
這樣就可以通過宿主機的共享文件及共享目錄去控制對應容器的數(shù)據(jù)了。
   
先啟動tomcat容器,將tomcat的配置文件和數(shù)據(jù)目錄跟宿主機做個映射。
[root@localhost ~]# docker cp tomcat:/usr/local/tomcat7/webapps /mnt/
[root@localhost ~]# docker cp tomcat:/usr/local/tomcat7/conf /mnt/
[root@localhost ~]# ls /mnt/conf/
catalina.policy  catalina.properties  context.xml  logging.properties  server.xml  tomcat-users.xml  web.xml
[root@localhost ~]# ls /mnt/webapps/
docs  examples  host-manager  manager  ROOT
   
然后關閉和刪除這個tomcat容器,重啟啟動,啟動時做目錄映射關系
[root@localhost ~]# docker stop tomcat
tomcat
[root@localhost ~]# docker rm tomcat
tomcat
   
[root@localhost ~]# docker run -t -i -d --name=tomcat -v /mnt/webapps:/usr/local/tomcat7/webapps -v /mnt/conf:/usr/local/tomcat7/conf -p 8888:8080 tomcat7 /bin/bash
63799add4a628b1b690eb9e538001e6872b12e8e03e39b4e7275f7bf49c2645f
   
[root@localhost ~]# docker attach tomcat
[root@63799add4a62 /]# /usr/local/tomcat7/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat7
Using CATALINA_HOME:   /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
   
......................溫馨提示一下.....................
上面在創(chuàng)建容器時啟動的進程是/bin/bash,容器創(chuàng)建成功后,需要啟動創(chuàng)建里其他的進程,比如上面的tomcat進程。
那么除了上面直接登錄容器內(nèi)啟動tomcat進程外,還可以在宿主機上通過docker exec啟動(前提是容器在啟動狀態(tài)中)
  
docker exec 命令用戶在運行狀態(tài)中的容器內(nèi)再次啟動新的進程。命令格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
[root@localhost ~]# docker exec tomcat /usr/local/tomcat7/bin/startup.sh   //如果啟動中出現(xiàn)卡的情況,就ctrl+c,不影響啟動結(jié)果
Tomcat started.
[root@linux-node2 ~]# docker attach my_tomcat
[root@f268eefdc283 /]# ps -ef|grep tomcat
root        30     0  1 10:13 ?        00:00:06 java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap start
root        76     1  0 10:23 ?        00:00:00 grep --color=auto tomcat
--------------------------------------------------------------------------------------------
如上在本機制作了tomcat7的鏡像,可以將這個鏡像上傳到別的機器上進行tomcat容器部署
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat7             latest              2ec9e2eb978a        39 minutes ago      562.3 MB
   
[root@localhost ~]# docker save tomcat7 > /opt/tomcat7.tar.gz
[root@localhost ~]# rsync -e "ssh -p22" -avpgolr /opt/tomcat7.tar.gz 192.168.1.17:/opt/
   
然后在192.168.1.17機器上部署tomcat容器
[root@linux-node2 ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
tomcat7                      latest              2ec9e2eb978a        58 minutes ago      562.3 MB
[root@linux-node2 ~]# docker run -t -i -d --name=my_tomcat tomcat7 /bin/bash
8657fa536c4a6308801d96b585671a22d08795bd891b0b2b20d86b843cde0040
[root@linux-node2 ~]# docker attach my_tomcat
[root@8657fa536c4a /]# /usr/local/tomcat7/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat7
Using CATALINA_HOME:   /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
--------------------------------------------------------------------------------------------

四、Mysql容器環(huán)境部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              67591570dd29        3 months ago        191.8 MB
啟動容器,進入容器內(nèi)編譯安裝mysql
[root@localhost ~]# docker run -t -i docker.io/centos /bin/bash
[root@2ccd29e52286 /]#  rpm -qa | grep mysql       //確保沒有自帶安裝mysql,有的話就卸載
[root@2ccd29e52286 /]#  yum -y install make gcc-c++ cmake bison-devel ncurses-devel
[root@2ccd29e52286 /]# groupadd mysql
[root@2ccd29e52286 /]# useradd -g mysql mysql -M -s /sbin/nologin
[root@2ccd29e52286 /]# cd /usr/local/src
[root@2ccd29e52286 src]# wget -c http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/mysql-5.6.34.tar.gz
[root@2ccd29e52286 src]# tar -zxvf mysql-5.6.34.tar.gz
[root@2ccd29e52286 src]# cd mysql-5.6.34/
[root@2ccd29e52286 mysql-5.6.34]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@2ccd29e52286 mysql-5.6.34]# make && make install
[root@2ccd29e52286 mysql-5.6.34]# mkdir -p /data/mysql/data
[root@2ccd29e52286 mysql-5.6.34]# chown -R mysql:mysql /usr/local/mysql
[root@2ccd29e52286 mysql-5.6.34]# chown -R mysql:mysql /data/mysql/data
初始化mysql
[root@2ccd29e52286 mysql-5.6.34]# cd /usr/local/mysql
[root@2ccd29e52286 mysql]# ./scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql
-------------------------------------------------------------------------------------------
如果報錯:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db: Data::Dumper
解決辦法:
[root@2ccd29e52286 mysql]# yum install -y perl-Module-Install.noarch
------------------------------------------------------------------------------------------
啟動mysql,并設置密碼
[root@2ccd29e52286 mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@2ccd29e52286 mysql]# /etc/init.d/mysql start
[root@2ccd29e52286 mysql]# mysql -uroot
.....
修改root密碼,執(zhí)行命令如下
mysql> SET PASSWORD = PASSWORD('123456');
若要設置root用戶可以遠程訪問,執(zhí)行
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
使授權立即生效
mysql> FLUSH PRIVILEGES;
提交為新鏡像
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2ccd29e52286        docker.io/centos    "/bin/bash"         3 hours ago         Up 3 hours                              modest_bose
[root@localhost ~]# docker commit 2ccd29e52286 mysql
sha256:3b965b11e7a01b9422c8d82a8352c60c83545698309d9511b4df6371bcfcd6a1
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              3b965b11e7a0        6 minutes ago       4.511 GB
docker.io/centos    latest              67591570dd29        3 months ago        191.8 MB
根據(jù)新提交的鏡像,啟動mysql容器
[root@localhost ~]# docker stop 2ccd29e52286
2ccd29e52286
[root@localhost ~]# docker rm 2ccd29e52286        //當然這個之前啟動的容器也可以不刪除,忽略就行。
2ccd29e52286
[root@localhost ~]# docker run -t -i -d --name=my_mysql -p 33061:3306 mysql /bin/bash
a02f56c3e7313733bcd58414d5dcd5501f8504352206ee321e9e2aeab15d6269
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
a02f56c3e731        mysql               "/bin/bash"         7 seconds ago       Up 6 seconds        0.0.0.0:33061->3306/tcp   my_mysql
啟動容器的mysql服務方法(也可以在上面創(chuàng)建容器的時候直接啟動,即將/bin/bash命令換成mysql啟動命令):
1)直接在宿主機上通過docker exec命令啟動
[root@localhost ~]# docker exec my_mysql /etc/init.d/mysql start        //如果啟動后出現(xiàn)卡的情況,就ctrl+c,不影響啟動結(jié)果
Starting MySQL SUCCESS!
2)登陸容器內(nèi)啟動
[root@localhost ~]# docker attach my_mysql
[root@a02f56c3e731 /]# /etc/init.d/mysql start
Starting MySQL SUCCESS!
查看容器啟動的進程
[root@localhost ~]# docker top my_mysql
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7340                28948               0                   14:21               pts/1               00:00:00            /bin/bash
root                8595                7340                0                   14:28               pts/1               00:00:00            /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid
mysql               9376                8595                0                   14:28               pts/1               00:00:00            /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql/ --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql//lib/plugin --user=mysql --log-error=/data/mysql/data/mysql-error.log --pid-file=/data/mysql/data/mysql.pid --socket=/usr/local/mysql/var/mysql.sock --port=3306
登陸容器查看
[root@a02f56c3e731 /]# netstat -tunlp         //首先yum安裝net-tools
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      -  
在容器內(nèi)的mysql里寫入一些數(shù)據(jù)
[root@a02f56c3e731 /]# /usr/local/mysql/bin/mysql -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
[root@a02f56c3e731 /]# ln -s /usr/local/mysql/var/mysql.sock  /var/lib/mysql/mysql.sock
ln: failed to create symbolic link '/var/lib/mysql/mysql.sock': File exists
[root@a02f56c3e731 /]# rm -f /var/lib/mysql/mysql.sock
[root@a02f56c3e731 /]# ln -s /usr/local/mysql/var/mysql.sock  /var/lib/mysql/mysql.sock
[root@a02f56c3e731 /]# /usr/local/mysql/bin/mysql -p123456
.......
mysql> create database wangshibo;
Query OK, 1 row affected (0.00 sec)
mysql> use wangshibo;
Database changed
mysql> create table hehe(
    -> id int(3),
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into hehe values(1,"wanglei");
Query OK, 1 row affected (0.01 sec)
mysql> insert into hehe values(2,"zhaomin");
Query OK, 1 row affected (0.01 sec)
查看容器ip,可以登陸容器內(nèi)ifconfig查看(首先要yum安裝net-tools)
[root@a02f56c3e731 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 117  bytes 319373 (311.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 102  bytes 7042 (6.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
或者在宿主機使用docker inspect命令查看容器ip
[root@localhost ~]# docker inspect my_mysql|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
在宿主機本地連接容器的mysql
[root@localhost ~]# mysql -u root -h 172.17.0.2 -p123456
ERROR 1130 (HY000): Host '172.17.0.1' is not allowed to connect to this MySQL server
出現(xiàn)錯誤的原因:
容器的網(wǎng)絡ip是根據(jù)宿主機的虛擬橋接網(wǎng)卡docker0自動分配的,而docker0的ip默認是172.17.0.1.
容器的mysql內(nèi)需要給這個ip授權。
[root@localhost ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
..........
登陸容器內(nèi)的mysql,進行授權
[root@a02f56c3e731 /]# /usr/local/mysql/bin/mysql -p123456
.......
mysql> select host,user,password from mysql.user;
+--------------+------+-------------------------------------------+
| host         | user | password                                  |
+--------------+------+-------------------------------------------+
| localhost    | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2ccd29e52286 | root |                                           |
| 127.0.0.1    | root |                                           |
| ::1          | root |                                           |
| localhost    |      |                                           |
| 2ccd29e52286 |      |                                           |
+--------------+------+-------------------------------------------+
6 rows in set (0.00 sec)
mysql> grant all privileges on *.* to root@'%' identified by "123456";
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,password from mysql.user;
+--------------+------+-------------------------------------------+
| host         | user | password                                  |
+--------------+------+-------------------------------------------+
| localhost    | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2ccd29e52286 | root |                                           |
| 127.0.0.1    | root |                                           |
| ::1          | root |                                           |
| localhost    |      |                                           |
| 2ccd29e52286 |      |                                           |
| %            | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+--------------+------+-------------------------------------------+
8 rows in set (0.00 sec)
再次在宿主機本機嘗試連接容器的mysql,發(fā)現(xiàn)可以正常連接!
[root@localhost ~]# mysql -u root -h 172.17.0.2 -p123456
.......
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wangshibo          |
+--------------------+
5 rows in set (0.01 sec)
MySQL [(none)]> select * from wangshibo.hehe;
+------+---------+
| id   | name    |
+------+---------+
|    1 | wanglei |
|    2 | zhaomin |
+------+---------+
2 rows in set (0.00 sec)
---------------------------------------------------------------------------------------------------
也可以再創(chuàng)建一個容器,使用--link進行容器鏈接。
這里需要特別注意一下"--link=my_mysql:mydb"(中間可以使用=,也可以空格隔開),這個參數(shù)是告訴容器需要使用my_mysql容器,并將其別名命名為mydb,這樣在這兩個容器里就可以使用mydb來作為提供mysql數(shù)據(jù)庫服務的機器名。
[root@localhost ~]#  docker run --rm -it --name mymysql2 --link my_mysql:mydb docker.io/centos /bin/bash
[root@f1534ad473f4 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  mydb 33d784ee3121 my_mysql
172.17.0.4  f1534ad473f4
[root@f1534ad473f4 /]# mysql -u root -h mydb -p123456
......
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wangshibo          |
+--------------------+
5 rows in set (0.00 sec)
MySQL [(none)]> select * from wangshibo.hehe;
+------+---------+
| id   | name    |
+------+---------+
|    1 | wanglei |
|    2 | zhaomin |
+------+---------+
2 rows in set (0.00 sec)
------------------------------------------------------------------------------------------------
在外部連接my_mysql容器內(nèi)的mysql,就需要通過映射到宿主機的33061端口了(首先在宿主機的iptables里開放33061端口的訪問)
[root@localhost ~]# vim /etc/sysconfig/iptables
......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 33061 -j ACCEPT
[root@localhost ~]# systemctl restart iptables.service
這樣在遠程,就可以使用宿主機的映射端口33061訪問容器mysql (使用-P指定端口進行mysql的連接)
[root@huanqiu_web1 ~]# mysql -uroot -h103.10.86.23 -P33061 -p123456
.......
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wangshibo          |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from wangshibo.hehe;
+------+---------+
| id   | name    |
+------+---------+
|    1 | wanglei |
|    2 | zhaomin |
+------+---------+
2 rows in set (0.00 sec)
mysql>

----------------------------------------------------------------------------------------
上面容器內(nèi)使用的是編譯安裝mysql,也可以yum安裝:

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# docker run -t -i --privileged -i --name=wang docker.io/centos /sbin/init     //容器啟動后,會一直在卡著的狀態(tài)中,先不用管,打開另一個終端窗口執(zhí)行下面命令登陸容器
[root@localhost ~]# docker exec -it wang /bin/bash
[root@e9efd323782a /]# yum install -y wget net-tools
[root@e9efd323782a /]# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
[root@e9efd323782a /]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
[root@e9efd323782a /]# yum install mysql-community-server
[root@e9efd323782a /]# systemctl start mysqld
[root@e9efd323782a /]# lsof -i:3306
COMMAND PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
mysqld  453 mysql   10u  IPv6 32200473      0t0  TCP *:mysql (LISTEN)

其他應用容器的部署與上面操作類似~

***************當你發(fā)現(xiàn)自己的才華撐不起野心時,就請安
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Docker 常見應用部署
Docker 部署前后端項目
docker學習筆記
不外傳秘訣|docker 快速搭建常用的服務環(huán)境
使用docker鏡像運行一個容器的操作…
Docker Nginx容器和Tomcat容器實現(xiàn)負載均衡與動靜分離操作
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服