Linux操作文档——Docker工具(compose、machine、swarm)


工具名称 说明
Docker Compose 是用来组装多容器应用的工具,可以在 Swarm集群中部署分布式应用
Docker Machine 是支持多平台安装Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装Docker
Docker Swarm 是Docker社区原生提供的容器集群管理工具

一 、Docker compose

官网文档地址https://docs.docker.com/compose/overview/

1、安装部署

[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/1.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   651  100   651    0     0    678      0 --:--:-- --:--:-- --:--:--   678
100 11.6M  100 11.6M    0     0  1626k      0  0:00:07  0:00:07 --:--:-- 2455k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose -v
docker-compose version 1.27.1, build 509cfb99

设置tab键的空格距离

[root@localhost ~]# vim .vimrc
set tabstop=2
[root@localhost ~]# source .vimrc

2、配置文件实例

version: "3"             //指定语法格式的版本
services:             //定义服务
   nginx:             //服务的名称
     container_name: web-nginx             //容器名称
     image: nginx             //使用的镜像
     restart: always
     ports:             //端口映射
       - 90:80
     volumes:
       - ./webserver:/usr/share/nginx/html

支持Dockerfile示例

[root@docker compose]# vim Dockerfile
FROM nginx
COPY ./webserver/index.html
/usr/share/nginx/html/index.html
[root@docker compose]# cat docker-compose.yaml
version: "3" 
services:
   nginx:
     build: .             //添加Dockerfile
     container_name: web-nginx
     image: nginx
     restart: always
     ports:
       - 90:80
     volumes:
       - ./webserver:/usr/share/nginx/html
[root@docker compose]# docker-compose up -d --build             //添加--build 选项

3、常用命令

帮助信息

[root@docker compose]# docker-compose --help

创建或重新创建服务使用的镜像

[root@docker compose]# docker-compose build

通过容器发送SIGKILL信号强行停止服务

[root@docker compose]# docker-compose kill nginx

显示service的日志信息

[root@docker compose]# docker-compose logs

暂停和恢复服务

[root@docker compose]# docker-compose pause             //暂停服务
[root@docker compose]# docker-compose unpause             //恢复被暂停的服务

查看服务中的端口与物理机的映射关系

[root@docker compose]# docker-compose port nginx 80             //查看服务中80端口映射到物理机上的端口

显示当前项目下的容器

[root@docker compose]# docker-compose ps

拉取服务依赖的镜像

[root@docker compose]# docker-compose pull

重启某个服务中的所有容器

[root@docker compose]# docker-compose restart

删除停止的服务(服务里的容器)

root@docker compose]# docker-compose rm
参数 说明 参数 说明
-f 强制删除 -v 删除与容器相关的卷(volumes)
在服务中运行一个一次性的命令
[root@docker compose]# docker-compose run nginx ls /

启动/停止运行某个服务的所有容器

[root@docker compose]# docker-compose start             //启动运行某个服务的所有容器
[root@docker compose]# docker-compose stop             //停止运行某个服务的所有容器

指定某个服务启动的容器个数

[root@docker compose]# docker-compose scale nginx=2
参数 说明 参数 说明
-f 用于指定配置文件 -p 用于指定项目名称

4、搭建wordpress博客

[root@localhost ~]# mkdir wordpress
[root@localhost ~]# cd wordpress/
[root@localhost wordpress]# vim docker-compose.yaml
version: "3.1"
services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
       WORDPRESS_DB_HOST: db
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: 123.com
       WORDPRESS_DB_NAME: wordpress
    
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: 123.com
      MYSQL_ROOT_PASSWORD: 123.com
[root@localhost wordpress]# docker-compose up -d

5、搭建LNMP环境

[root@localhost ~]# mkdir /data/wwwroot
[root@localhost ~]# mkdir /data/docker
[root@localhost ~]# docker run -itd --name test nginx
[root@localhost ~]# docker cp test:/etc/nginx /data/docker/
[root@localhost ~]# docker cp test:/usr/share/nginx/html /data/wwwroot/
[root@localhost ~]# mkdir lnmp
[root@localhost ~]# cd lnmp/
[root@localhost lnmp]# vim docker-compose.yaml
 version: "3"
 services:
   nginx:
     image: nginx
     ports:
       - 80:80
     volumes:
       - /data/wwwroot/html:/usr/share/nginx/html
       - /data/docker/nginx:/etc/nginx

   php:
     image: php:7.2-fpm
     ports:
       - 9000:9000
     volumes:
       - /data/wwwroot/html:/usr/share/nginx/html

   mysql:
     image: mysql:5.7
     ports:
       - 3306:3306
     volumes:
       - /data/mysql/mysql:/var/lib/mysql
     environment:
       - MYSQL_ROOT_PASSWORD=123456
[root@localhost lnmp]# docker-compose up -d

二、Docker machine

node01 node02 node03
192.168.1.10 192.168.1.20 192.168.1.30

1、环境要求

全部关闭防火墙、清空iptables规则、没有安装docker

[root@node01 ~]# systemctl stop firewalld
[root@node01 ~]# systemctl disable firewalld
[root@node01 ~]# iptables -F
[root@node01 ~]# iptables-save

2、安装Docker machine

[root@node01 ~]# curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && cp /tmp/docker-machine /usr/local/bin/docker-machine
[root@node01 ~]# docker-machine --version
docker-machine version 0.16.0, build 702c267f

3、做域名解析,设置免密登录(互相)

[root@node01 ~]# vim /etc/hosts
192.168.1.10 node01
192.168.1.20 node02
192.168.1.30 node03
[root@node01 ~]# ssh-keygen -t rsa
[root@node01 ~]# ssh-copy-id root@node02
[root@node01 ~]# ssh-copy-id root@node03
[root@node01 ~]# scp /etc/hosts node02:/etc/hosts
[root@node01 ~]# scp /etc/hosts node03:/etc/hosts

4、创建主机

[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.10 --generic-ssh-key ~/.ssh/id_rsa host1
[root@node01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
host1   -        generic   Running   tcp://192.168.1.10:2376           v19.03.13   
[root@node01 ~]# netstat -anpt | grep 2376
tcp6       0      0 :::2376                 :::*                    LISTEN      104505/dockerd      

5、远程创建node02,node03主机

[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.20 --generic-ssh-key ~/.ssh/id_rsa host2
[root@node01 ~]# docker-machine create --driver generic --generic-ip-address=192.168.1.30 --generic-ssh-key ~/.ssh/id_rsa host3

6、查看主机

[root@node01 ~]# docker-machine ls
NAME     ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
node01   -        generic   Running   tcp://192.168.1.10:2376           v19.03.13   
node02   -        generic   Running   tcp://192.168.1.20:2376           v19.03.13 
node03   -        generic   Running   tcp://192.168.1.30:2376           v19.03.13     

7、优化docker machine的shell

[root@node01 ~]# vim /usr/local/etc/bash_completion.d
base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
[root@node01 ~]# source /usr/local/etc/bash_completion.d
[root@node01 ~]# source /etc/bash_completion.d/docker-machine-prompt.bash
[root@node01 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
[root@node01 ~]# source .bashrc

8、查看对应主机的信息

[root@node01 ~]# docker-machine env host1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.10:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell: 
# eval $(docker-machine env host1)      //连接主机命令
[root@node01 ~]# eval $(docker-machine env host2)
[root@node01 ~ [host2]]#

三、docker swarm集群

1、node节点

概念 说明
Swarm 作用运行docker engin(引擎)的多个主机组成的集群
node 每一个docker engin都是一个node(节点),分为 manager 和worker
manager node 负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有managernode。
worker node 接受并执行由manager node 派发的任务,并且默认manager node也是一个work node,不过可以将它设为manager-onlynode.让它只负责编排和管理工作。
service 用来定义worker上执行的命令

2、初始化集群

[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (ifs6xxct4dbmmkjsq7oawpu30) is now a manager.

To add a worker to this swarm, run the following command:
#添加work节点运行的命令
    docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-4snc764xlxzh3ghtfcaxx8uzp 192.168.1.10:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
参数 说明
–advertise-addr 指定与其他Node通信的地址

3、节点操作

1、添加work节点

[root@docker02 ~]# docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-4snc764xlxzh3ghtfcaxx8uzp 192.168.1.10:2377
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Active              Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active                                  18.09.0
vb2lonkjx944wyrofd3xplqop     docker03            Ready               Active                                  18.09.0

2、添加manager 节点

[root@docker01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-dyrnsrnxwm84i1nk4aniw1so4 192.168.1.10:2377
[root@docker03 ~]# docker swarm join --token SWMTKN-1-1m3lg48xri63c8nhhdjoidcwi2tdugrqa367g2uvsijgd405rd-dyrnsrnxwm84i1nk4aniw1so4 192.168.1.10:2377
This node joined a swarm as a manager.
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Drain               Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active                                  18.09.0
j6n7zb15uyqzx63cfyr7ptff2     docker03            Ready               Active              Reachable           18.09.0

3、节点升级

将warm节点的work升级为manage

[root@docker01 ~]# docker node promote docker02
Node docker02 promoted to a manager in the swarm.
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Drain               Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active              Reachable           18.09.0
vb2lonkjx944wyrofd3xplqop     docker03            Ready               Active                                  18.09.0

4、节点降级

将swarm节点的manager降级为work

[root@docker01 ~]# docker node demote docker02
Manager docker02 demoted in the swarm.
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Drain               Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active                                  18.09.0
vb2lonkjx944wyrofd3xplqop     docker03            Ready               Active                                  18.09.0

5、节点申请离开一个集群

[root@docker03 ~]# docker swarm leave
Node left the swarm.
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Drain               Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active                                  18.09.0
vb2lonkjx944wyrofd3xplqop     docker03            Down                Active                       

6、删除节点

[root@docker01 ~]# docker node rm docker03
docker03
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ifs6xxct4dbmmkjsq7oawpu30 *   docker01            Ready               Drain               Leader              18.09.0
y32kx76irorhbq3zpjoe13cs9     docker02            Ready               Active                                  18.09.0

4、部署docker swarm集群网络

[root@docker01 ~]# docker network create -d overlay --attachable docker
55dzciuvpuimx1fzyvgyrnrkh

5、部署一个图形化webUI 界面

[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer

如果访问不到网页,需开启路由转发

[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p

在这里插入图片描述

6、service(服务)

1、创建service

[root@docker01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx
jqubcwzqomj1dogwc2x7v887n
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 
参数 说明
–replicas 副本数量
在这里插入图片描述

2、查看service

[root@docker01 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
soux8c2909bo        web1                replicated          1/1                 nginx:latest        *:30000->80/tcp

3、查看service 信息

[root@docker01 ~]# docker service ps web1 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
oshddet9cjky        web1.1              nginx:latest        docker01            Running             Running 31 seconds ago     

4、设置manager node工作状态

[root@docker01 ~]# docker node update docker01 --availability active|pause|drain
docker01                                                         活跃|暂停|关闭

在这里插入图片描述

5、删除服务

[root@docker01 ~]# docker service rm web1
web1

7、服务的升级与回滚

1、搭建私有仓库

[root@docker01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000
[root@docker01 ~]# systemctl daemon-reload
[root@docker01 ~]# systemctl restart docker

2、自定义镜像

[root@docker01 ~]# docker run -itd -p 80 --name httpd1 httpd:latest 
[root@docker01 ~]# echo 111 > index.html
[root@docker01 ~]# docker cp index.html httpd1:/usr/local/apache2/htdocs
[root@docker01 ~]# docker commit httpd1 httpd.v1
[root@docker01 ~]# docker tag httpd.v1:latest 192.168.1.10:5000/httpd.v1
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v1
[root@docker01 ~]# echo 222 > index.html
[root@docker01 ~]# docker cp index.html httpd1:/usr/local/apache2/htdocs
[root@docker01 ~]# docker commit httpd1 httpd.v2
[root@docker01 ~]# docker tag httpd.v2:latest 192.168.1.10:5000/httpd.v2
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v2
[root@docker01 ~]# echo 333 > index.html
[root@docker01 ~]# docker commit httpd1 httpd.v3
[root@docker01 ~]# docker tag httpd.v3:latest 192.168.1.10:5000/httpd.v3
[root@docker01 ~]# docker push 192.168.1.10:5000/httpd.v3
[root@docker01 ~]# curl -XGET http://192.168.1.10:5000/v2/_catalog
{
    
    "repositories":["httpd.v1","httpd.v2","httpd.v3"]}

3、发布一个服务

[root@docker01 ~]# docker service create --replicas 3 --name web -p 80:80 192.168.1.10:5000/httpd.v1
mqxr2hsla8iyhd4jpxw094nzw
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service converged 

在这里插入图片描述

4、服务的扩容与缩容

scale进行设置副本数量

[root@docker01 ~]# docker service scale web=6
web scaled to 6
overall progress: 6 out of 6 tasks 
1/6: running   
2/6: running   
3/6: running   
4/6: running   
5/6: running   
6/6: running   
verify: Service converged 

在这里插入图片描述

5、服务的升级与回滚

1、更新
[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd.v2 web
web
overall progress: 6 out of 6 tasks 
1/6: running   
2/6: running   
3/6: running   
4/6: running   
5/6: running   
6/6: running   
verify: Service converged 

或者

[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd.v3 --update-parallelism 2 --update-delay 1m web 
web
overall progress: 6 out of 6 tasks 
1/6: running   
2/6: running   
3/6: running   
4/6: running   
5/6: running   
6/6: running   
verify: Service converged 
参数 说明
–update-parallelism 设置并行更新的副本数量
–update-delay 指定滚动更新的时间间隔
在这里插入图片描述
2、回滚
[root@docker01 ~]# docker service rollback web
web
rollback: manually requested rollback 
overall progress: rolling back update: 6 out of 6 tasks 
1/6: running   
2/6: running   
3/6: running   
4/6: running   
5/6: running   
6/6: running   
verify: Service converged 

8、指定容器运行节点

1、给节点添加标签
[root@docker01 ~]# docker node update --label-add disk=max docker02
docker02
2、查看标签信息
[root@docker01 ~]# docker node inspect docker02
[
    {
    
    
        "ID": "y32kx76irorhbq3zpjoe13cs9",
        "Version": {
    
    
            "Index": 310
        },
        "CreatedAt": "2020-09-28T14:34:56.097756526Z",
        "UpdatedAt": "2020-09-29T03:42:20.865860853Z",
        "Spec": {
    
    
            "Labels": {
    
    
                "disk": "max"
            },

在这里插入图片描述

3、运行服务,指定节点
[root@docker01 ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
z5momze933w5ewyxm864orayk
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service converged 
[root@docker01 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
z3ysfn8ukure        test                replicated          3/3                 nginx:latest        
[root@docker01 ~]# docker service ps test
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
30mli9tz2tv0        test.1              nginx:latest        docker02            Running             Running 12 seconds ago                       
ja1ewvxnvvvt        test.2              nginx:latest        docker02            Running             Running 12 seconds ago                       
ni7nhj53s2vc        test.3              nginx:latest        docker02            Running             Running 12 seconds ago                       

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/g950904/article/details/108546168