關于國內(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) |
其他應用容器的部署與上面操作類似~