跳到主要内容
  1. 所有文章/
  2. Docker学习笔记/

Docker03部署案例

·📄 2586 字·🍵 6 分钟

部署Nginx #

  1. 搜索镜像,建议去 docker hub 搜索,可以看到帮助文档
  2. 下载镜像
  3. 运行测试
  4. 配置容器内的ngnix的配置文件

https://hub.docker.com/

image-20210504094603067.png

[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>

开放对应端口后,公网访问看到效果如下图:

image-20210504102706906.png

查看容器内的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 #

  1. 搜索和下载 tomcat
  2. 启动运行
  3. 测试效果
#运行时提示错误
[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

查看效果:测试访问没有问题

image-20210504105656898.png

发现问题:

  1. 容器内部的 Linux 命令变少了(镜像只保证了最小的可运行环境)
  2. 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

查看效果:(注意一定要在服务器的安全组中开放对应的端口!!!)

image-20210504112530764.png

部署Mysql #

注意:官网 中解释 Mysql 是要配置数据库密码的!!

6487268471927.jpg

#下载镜像 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

使用数据库连接工具连接,查看连接是否成功:

发现连接成功:

Snipaste_2021-05-14_12-49-58.jpg

新建数据库并查看主机的文件是否对应改变:

Snipaste_2021-05-14_12-56-29.jpg

[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 集群部署 #

实现效果:

image-20210518090322232.png

使用脚本创建 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

image-20210518100202067.png

查看效果

/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主机 挂了之后,存取效果:

image-20210518102018165.png

实战:Springboot微服务打包成Docker镜像 #

总结:以后发布项目,就是给别人一个一个的镜像了。

  1. springboot项目打成jar包的形式,-packeage

  2. 下载docker插件

    image-20210518105425252.png

  3. 编写Dockerfile

    FROM java:8
    COPY *.jar /app.jar
    CMD ["--server.port=8080"]
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  4. 新建目录放置 Dockerfile 和 jar 包

    image-20210518105510500.png

    image-20210518105612437.png

  5. 生成镜像并运行

    [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
    
  6. 查看效果

    image-20210518110217356.png

部署 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
.......

查看效果:

image-20210527235831870.png

说明成功部署:

image-20210527235933148.png