Docker03部署案例
目录
部署Nginx #
- 搜索镜像,建议去 docker hub 搜索,可以看到帮助文档
- 下载镜像
- 运行测试
- 配置容器内的ngnix的配置文件
[root@izwz91mv6i3x6k12jjqh60z ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7ec5a41d630: Pull complete
aa1efa14b3bf: Pull complete
b78b95af9b17: Pull complete
c7d6bca2b8dc: Pull complete
cf16cd8e71e0: Pull complete
0241c68333ef: Pull complete
Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@izwz91mv6i3x6k12jjqh60z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62d49f9bab67 2 weeks ago 133MB
centos latest 300e315adb2f 4 months ago 209MB
#参考运行容器的命令
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d --name nginx01 -p 3304:80 nginx
dccb2ad300dbbb4598dbb2017805fba5364379326d4a6296dac9b88bc61d8970
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dccb2ad300db nginx "/docker-entrypoint.…" 21 seconds ago Up 20 seconds 0.0.0.0:3304->80/tcp, :::3304->80/tcp nginx01
#测试是否运行成功,发送一个请求
[root@izwz91mv6i3x6k12jjqh60z ~]# curl localhost:3304
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
开放对应端口后,公网访问看到效果如下图:
查看容器内的ngnix的配置文件:
[root@izwz91mv6i3x6k12jjqh60z ~]# docker exec -it nginx01 /bin/bash
root@dccb2ad300db:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@dccb2ad300db:/# cd /etc/nginx
root@dccb2ad300db:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
端口暴露原理示意图:
问题:每次改动 nginx
配置文件,都需要进入容器内部?十分的麻烦,要是可以在容器外部提供一个映射路径,达到在外部文件修改的同时,同步修改内部就好了!
解决技术:数据卷技术!!
部署Tomcat #
- 搜索和下载 tomcat
- 启动运行
- 测试效果
#运行时提示错误
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d -p 8080:8080 --name tomcat02 tomcat
9cdceb4daa857dbd5c4e03dfd7eeded50ae027d8484137889d605871520dee97
docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat02 (56f474809e2ca18c3e9ce63318aa6918600e004621743625e4be5754f74b6493): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.18.0.2:8080 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
#重启后再次运行
[root@izwz91mv6i3x6k12jjqh60z ~]# systemctl restart docker
#提示容器名已经有的
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d -p 8080:8080 --name tomcat02 tomcat
docker: Error response from daemon: Conflict. The container name "/tomcat02" is already in use by container "9cdceb4daa857dbd5c4e03dfd7eeded50ae027d8484137889d605871520dee97". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
#没有正在运行的容器
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#查看历史记录
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cdceb4daa85 tomcat "catalina.sh run" 5 minutes ago Created tomcat02
#开启容器
[root@izwz91mv6i3x6k12jjqh60z ~]# docker start 9cdceb4daa85
9cdceb4daa85
#运行成功
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cdceb4daa85 tomcat "catalina.sh run" 5 minutes ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat02
查看效果:测试访问没有问题
发现问题:
- 容器内部的
Linux
命令变少了(镜像只保证了最小的可运行环境) - webapps中没有内容(需要把
webapps.dist
文件夹的内容复制到webapps
)
#查看镜像
[root@izwz91mv6i3x6k12jjqh60z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest c0e850d7b9bb 3 weeks ago 667MB
nginx latest 62d49f9bab67 4 weeks ago 133MB
portainer/portainer latest 580c0e4e98b0 8 weeks ago 79.1MB
centos latest 300e315adb2f 5 months ago 209MB
#运行 tomcat
[root@izwz91mv6i3x6k12jjqh60z ~]# docker run -d -p 8080:8080 --name tomcat02 tomcat
39f11d68d64d3c585dd3a7f0a4e2123e03703cead8361c1cf0b6a61c1a7fb474
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39f11d68d64d tomcat "catalina.sh run" 16 seconds ago Up 15 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat02
#进入容器内部
[root@izwz91mv6i3x6k12jjqh60z ~]# docker exec -it tomcat02 /bin/bash
#发现一些命令不存在
root@39f11d68d64d:/usr/local/tomcat# ll
bash: ll: command not found
root@39f11d68d64d:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
#webapps文件夹没有内容
root@39f11d68d64d:/usr/local/tomcat# cd webapps
root@39f11d68d64d:/usr/local/tomcat/webapps# ls
root@39f11d68d64d:/usr/local/tomcat/webapps# cd ../
#webapps.dist文件夹有内容
root@39f11d68d64d:/usr/local/tomcat# cd webapps.dist
root@39f11d68d64d:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@39f11d68d64d:/usr/local/tomcat/webapps.dist# cd ../
#把webapps.dist文件夹的内容复制到 webapps
root@39f11d68d64d:/usr/local/tomcat# cp -r webapps.dist/* webapps
#快捷键 ctrl+P+Q 退出容器但不停止容器运行
root@39f11d68d64d:/usr/local/tomcat# read escape sequence
#确认容器状态
[root@izwz91mv6i3x6k12jjqh60z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39f11d68d64d tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat02
查看效果:(注意一定要在服务器的安全组中开放对应的端口!!!)
部署Mysql #
注意:官网 中解释 Mysql 是要配置数据库密码的!!
#下载镜像 Mysql5.7
[root@izwz91mv6i3x6k12jjqh60z ceshi]# docker pull mysql:5.7
5.7: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
a023ae82eef5: Pull complete
e76c35f20ee7: Pull complete
e887524d2ef9: Pull complete
ccb65627e1c3: Pull complete
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
#启动镜像并挂载目录配置数据库的初始密码
[root@izwz91mv6i3x6k12jjqh60z ceshi]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
d869c76c987c305b9dd91321f523db7708a2a1c220712b4beaf2ac7f0e68fa1e
使用数据库连接工具连接,查看连接是否成功:
发现连接成功:
新建数据库并查看主机的文件是否对应改变:
[root@izwz91mv6i3x6k12jjqh60z home]# ls
admin ceshi mysql test.java
[root@izwz91mv6i3x6k12jjqh60z home]# cd mysql/data
[root@izwz91mv6i3x6k12jjqh60z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
测试删除 mysql 容器后,主机上的文件是否依然存在:
[root@izwz91mv6i3x6k12jjqh60z data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d869c76c987c mysql:5.7 "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
1309cabd368d centos "/bin/bash" 38 minutes ago Up 38 minutes epic_neumann
39f11d68d64d tomcat "catalina.sh run" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat02
[root@izwz91mv6i3x6k12jjqh60z data]# docker rm -f d869c76c987c
d869c76c987c
[root@izwz91mv6i3x6k12jjqh60z data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
发现我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化的功能!!
实战:Redis 集群部署 #
实现效果:
使用脚本创建 6 个 Redis
配置
for port in $(seq 1 6);do
mkdir -p /mydata/redis/node-$port/conf
touch /mydata/redis/node-$port/conf/redis.conf
cat << EOF >/mydata/redis/node-$port/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1$port
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
创建网络和容器:
[root@izwz91mv6i3x6k12jjqh60z /]# docker network create redis-net --subnet 172.38.0.0/16
42efb2e7749d07ee0e50b4d375a00829cfd390fddca9a5e72a87bb660059a4eb
[root@izwz91mv6i3x6k12jjqh60z /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d71469651905 bridge bridge local
4210c11fb888 host host local
d1ede6bb4ad9 mynet bridge local
15f30a8dc35d none null local
42efb2e7749d redis-net bridge local
使用脚本创建 6个 Redis容器,并且连接自定义网络:
for port in $(seq 1 6);do
docker run -p 637$port:6379 -p 1637$port:16379 --name redis-$port \
-v /mydata/redis/node-$port/data:/data \
-v /mydata/redis/node-$port/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.38.0.1$port redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf;
done
[root@izwz91mv6i3x6k12jjqh60z /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afea673b0bf9 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6
00b3c38df42d redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 5 seconds ago Up 5 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5
d6714f27ebe5 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4
9e4a7bdc96f8 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3
02bddddbab7f redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2
4d15ad89dbeb redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1
创建 Redis
集群:
#进入其中一个容器
docker exec -it redis-1 /bin/sh
#创建 redis集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
查看效果
/data # redis-cli -c
#进入 redis集群,查看集群信息
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3 #主机数量
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:495
cluster_stats_messages_pong_sent:511
cluster_stats_messages_sent:1006
cluster_stats_messages_ping_received:506
cluster_stats_messages_pong_received:495
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1006
#进入 redis集群,查看集群具体信息
127.0.0.1:6379> cluster nodes
44163f5e3981aee904cce4dbeeac17d671d2d20c 172.38.0.11:6379@16379 myself,master - 0 1621303492000 1 connected 0-5460
0d277a7f5d0f9d79058a19fa3e7d1c7274e6c774 172.38.0.12:6379@16379 master - 0 1621303494000 2 connected 5461-10922
af333ed46be9362606c8c4ea9e51a1b95100e910 172.38.0.13:6379@16379 master - 0 1621303493144 3 connected 10923-16383
f273c45aff9863b351659907a103176459d30bec 172.38.0.15:6379@16379 slave 44163f5e3981aee904cce4dbeeac17d671d2d20c 0 1621303494146 5 connected
b1e3867406fafd0b99a5317382817aa4ea43f7f0 172.38.0.16:6379@16379 slave 0d277a7f5d0f9d79058a19fa3e7d1c7274e6c774 0 1621303493545 6 connected
4c4c1a05b5c83ac2510d7508c43fa158a2355b5f 172.38.0.14:6379@16379 slave af333ed46be9362606c8c4ea9e51a1b95100e910 0 1621303493000 4 connected
测试存取
#主机存了,其他主机也会存
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
#从13主机读取出来
172.38.0.13:6379> get a
"b"
测试 13主机
挂了之后,存取效果:
实战:Springboot微服务打包成Docker镜像 #
总结:以后发布项目,就是给别人一个一个的镜像了。
将
springboot
项目打成jar包的形式,-packeage
下载
docker插件
编写
Dockerfile
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
新建目录放置
Dockerfile 和 jar 包
生成镜像并运行
[root@izwz91mv6i3x6k12jjqh60z /]# cd /home/springboot [root@izwz91mv6i3x6k12jjqh60z springboot]# ls Dockerfile springboot-thymeleaf-1.0.0-SNAPSHOT.jar #构建镜像 [root@izwz91mv6i3x6k12jjqh60z springboot]# docker build -t springboot-demo . Sending build context to Docker daemon 18.25MB Step 1/5 : FROM java:8 8: Pulling from library/java 5040bd298390: Pull complete fce5728aad85: Pull complete 76610ec20bf5: Pull complete 60170fec2151: Pull complete e98f73de8f0d: Pull complete 11f7af24ed9c: Pull complete 49e2d6393f32: Pull complete bb9cdec9c7f3: Pull complete Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d Status: Downloaded newer image for java:8 ---> d23bdf5b1b1b Step 2/5 : COPY *.jar /app.jar ---> 7864489b9853 Step 3/5 : CMD ["--server.port=8080"] ---> Running in eeac0a613d6c Removing intermediate container eeac0a613d6c ---> 35cb82031d7d Step 4/5 : EXPOSE 8080 ---> Running in dbbb5c136b36 Removing intermediate container dbbb5c136b36 ---> 76ac4f35a87f Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"] ---> Running in d825f07a8666 Removing intermediate container d825f07a8666 ---> 5723d2de431d Successfully built 5723d2de431d Successfully tagged springboot-demo:latest #运行容器 [root@izwz91mv6i3x6k12jjqh60z springboot]# docker run -d -p8080:8080 --name test-demo springboot-demo ac4c3fde1bf1e49fe99d723b39bc147211be7289ccd73ee8db01736b75ee49a8
查看效果
部署 wordpress #
参考官网教程:https://docs.docker.com/samples/wordpress/
新建并进入目录:my_wordpress
[root@izwz91mv6i3x6k12jjqh60z composetest]# cd ../
[root@izwz91mv6i3x6k12jjqh60z home]# mkdir my_wordpress
[root@izwz91mv6i3x6k12jjqh60z home]# ls
admin ceshi composetest mysql my_wordpress springboot test
编写 docker-compose.yml
:
version: "2.3"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
后台启动:
[root@izwz91mv6i3x6k12jjqh60z my_wordpress]# docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Creating volume "my_wordpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
.......
查看效果:
说明成功部署: