2. 容器常用操作

一、创建容器

1、格式

手动上传镜像

[root@localhost ~]# docker load -i centos7.tar 
174f56854903: Loading layer [==================================================>]  211.7MB/211.7MB
Loaded image: centos:7
[root@localhost ~]# 
[root@localhost ~]# docker image ls 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       7         eeb6ee3f44bd   2 years ago   204MB
# docker run [选项] 镜像名称 [命令]

创建容器

[root@martin-host ~]# docker run -tid centos:7 /bin/bash 
e4610c96d2a06645eed9e0b1fe5cc1cb1fb38c5b4258515590e37be72d4130fa

-t, -t:提供操作终端
-d:后台运行

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
e4610c96d2a0   centos:7   "/bin/bash"   25 seconds ago   Up 24 seconds             nervous_elion

2、容器的运行是依赖于一个持续的进程的

[root@martin-host ~]# docker run -tid centos:7 ls 
ca40ba6b332421da4ecf41ce0f25e05c48e24fd365501d36241b69fef6796e7a
[root@martin-host ~]# docker ps -a 
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
ca40ba6b3324   centos:7   "ls"          12 seconds ago   Exited (0) 11 seconds ago             agitated_chatelet
e4610c96d2a0   centos:7   "/bin/bash"   5 minutes ago    Up 5 minutes                          nervous_elion

[root@martin-host ~]# docker run -tid centos:7 sleep 10 
60ab18232b89e65adffa0f4f0e2c1321ef531249bbfa86b7fa0e93033851bf35

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS                     PORTS     NAMES
60ab18232b89   centos:7   "sleep 10"    4 seconds ago   Up 3 seconds                         quirky_stonebraker
ca40ba6b3324   centos:7   "ls"          3 minutes ago   Exited (0) 3 minutes ago             agitated_chatelet
e4610c96d2a0   centos:7   "/bin/bash"   8 minutes ago   Up 8 minutes                         nervous_elion

3、查看镜像定义的默认执行的指令

[root@martin-host ~]# docker run -tid centos:7 
17ff1296507d1636de43b228c1ec2c3838767ec7ea2175dfa3e3be892e05db4c
[root@martin-host ~]#

系统级别镜像: /bin/bash
应用级别镜像:启动对应的服务 

查看镜像的详细信息,找Cmd的关键字

[root@martin-host ~]# docker image inspect 镜像名称 

二、容器管理常用操作

1、查看容器

[root@martin-host ~]# docker ps -a

[root@martin-host ~]# docker ps 

2、查看容器的详细信息

[root@martin-host ~]# docker inspect e4610c 

3、查看日志

[root@martin-host ~]# docker logs cbf301f 

4、连接登录容器

[root@martin-host ~]# docker exec -ti e4610 bash 
[root@e4610c96d2a0 /]# mkdir abc
[root@e4610c96d2a0 /]# touch file01
[root@e4610c96d2a0 /]# exit
exit
[root@martin-host ~]# docker exec -ti e4610 ls /tmp
[root@martin-host ~]# docker exec -ti e4610 ping 10.11.0.254

5、删除容器

[root@martin-host ~]# docker rm f781 60ab ca40 e461 

[root@martin-host ~]# docker rm -f 7f9c29

[root@martin-host ~]# docker stop 17ff
[root@martin-host ~]# docker rm 17ff

6、启动/停止/重启容器

[root@martin-host ~]# docker {start|stop|restart} 容器ID/名称 

7、杀死容器

[root@martin-host ~]# docker kill cbf3
cbf3

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                       PORTS     NAMES
cbf301fcbe8e   nginx:1.18   "/docker-entrypoint.…"   15 minutes ago   Exited (137) 2 seconds ago             dazzling_williamson

8、导出/导入容器

// 导出容器
[root@martin-host ~]# docker export -o cbf3.tar cbf3 
[root@martin-host ~]# ls
anaconda-ks.cfg  cbf3.tar  centos7.tar  mysql57.tar  nginx18.tar  tomcat.tar
[root@martin-host ~]# 

// 导入容器
[root@martin-host ~]# docker import cbf3.tar 

三、容器常用选项

1、后台运行 -d

[root@martin-host ~]# docker run -ti centos:7 
[root@bfd7a16ca556 /]# exit

2、指定容器名称、主机名

[root@martin-host ~]# docker run -tid --name=test1 --hostname=test1 centos:7 
009be2d89fff1fc5bad453083af54648a87e8cab3e36a3b5bdf8557128509c4d

[root@martin-host ~]# docker exec -ti test1 bash
[root@test1 /]# 
[root@test1 /]# exit

3、设置容器开机自启动

[root@martin-host ~]# docker run -tid --name=test2 --hostname=test2 --restart=always centos:7 
4b07cce84d6c53dc01b46ab8e4f56146954053487cbe5bb50c5d7cf8a10571e1

4、发布容器服务

  • -p 物理机端口:容器端口
[root@martin-host ~]# docker run -tid --name=test4 --hostname=test4 -p 80:80 nginx:1.18 
6cbdfdb366289b1081b0078efd809ff3edccb4bf13c74a6378fa34b1dff965bd

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                       PORTS                               NAMES
6cbdfdb36628   nginx:1.18   "/docker-entrypoint.…"   3 seconds ago    Up 3 seconds                 0.0.0.0:80->80/tcp, :::80->80/tcp   test4
  • -P 随机发布端口
[root@martin-host ~]# docker run -tid --name=test6 --hostname=test6 -P nginx:1.18 
17186784a1ad15db9c6446bb61a34b45974a154a6841a4dfd49a545fa0602b1d

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS                        PORTS                                     NAMES
17186784a1ad   nginx:1.18   "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds                  0.0.0.0:32768->80/tcp, :::32768->80/tcp   test6

5、传递环境变量

https://hub.docker.com/

  • -e 变量名称=值
[root@martin-host ~]# docker run -tid --name=test7 --hostname=test7 -e NAME=martin centos:7 
a79d29b19892231eefe0428bd2c38778ce1cbaaacc170cb1999de072bf124043

[root@martin-host ~]# docker exec -ti test7 bash
[root@test7 /]# 
[root@test7 /]# echo $NAME
martin
[root@test7 /]# exit
exit
[root@martin-host ~]# docker run -tid --name=test8 --hostname=test8 \
> -e MYSQL_ROOT_PASSWORD=redhat mysql:5.7 
ecb6b7a83da1445c29a3bf6527baaa1bddf284936068272d9042693af764b2fb
[root@martin-host ~]# docker run -tid --name=test9 --hostname=test9 \
> -e MYSQL_ROOT_PASSWORD=redhat \
> -e MYSQL_DATABASE=it \
> -e MYSQL_USER=admin \
> -e MYSQL_PASSWORD=redhat \
> mysql:5.7

6、持久化存储

-v 物理机目录:容器目录

[root@martin-host ~]# docker run -tid --name=test1 --hostname=test1 -v /opt/test1:/test1 centos:7 
39103dfa0553136e16da5486a3e3fa75b6ee7ce954a4345e31be7177e9ee012a

[root@martin-host ~]# docker exec -ti test1 bash

[root@test1 /]# touch /test1/{1..5}
[root@test1 /]# ls /test1/
1  2  3  4  5
[root@test1 /]# exit

查看镜像对应的持久化目录, 使用docker image inspect查看详细信息找Volumes关键字
[root@martin-host ~]# docker run -tid --name=test2 --hostname=test2 \
> -e MYSQL_ROOT_PASSWORD=redhat \
> -v /opt/test2/:/var/lib/mysql \
> mysql:5.7 
d509d17f13de8e6616600bc1c1dda80cfa2c9299b2febff193e3f8334860c624
[root@martin-host ~]# 

多个容器挂载同一个目录

[root@martin-host ~]# docker run -tid --name=test3 --hostname=test3 -v /opt/test1/:/test3 centos:7 
b6ff36c2d3e30fa827e7efc7e2856cc86c6bdd6bc481c444c0ebacc8dfc7abc6
[root@martin-host ~]# 
[root@martin-host ~]# docker run -tid --name=test4 --hostname=test4 -v /opt/test1/:/test4 centos:7 
d09cb6472eea3e2ea7daadb9f90bea5d905f1e63eb10e4b7e32b49e060640b7d

[root@martin-host ~]# 
[root@martin-host ~]# 
[root@martin-host ~]# docker exec -ti test3 bash
[root@test3 /]# ls /test3/
1  1.jpg  2  2.jpg  3  3.jpg  4  4.jpg  5  5.jpg
[root@test3 /]# exit
exit
[root@martin-host ~]# 
[root@martin-host ~]# docker exec -ti test4 bash
[root@test4 /]# ls /test4/
1  1.jpg  2  2.jpg  3  3.jpg  4  4.jpg  5  5.jpg
[root@test4 /]# exit
exit

7、容器中应用的配置文件

[root@martin-host ~]# cat /opt/my.cnf
[mysqld]
server_id=11
log_bin=master

[root@martin-host ~]# docker run -tid --name=test5 --hostname=test5 -e MYSQL_ROOT_PASSWORD=redhat -v /opt/my.cnf:/etc/my.cnf mysql:5.7
7d6486c7fb56c2d2e86ef1a914bc7e1036bde3fa1af60b8ddc07f2a89ab8381e

在物理机上修改配置,重启容器

8、定义容器的通信别名 --link=容器名称:别名

容器不允许使用IP通信

[root@martin-host ~]# docker run -tid --name=test6 centos:7 
7596c3b5554193d0529ba76039d3c4ecd947813756551829354cd6d8a29d495f

[root@martin-host ~]# docker run -tid --name=test7 --link=test6:test6 centos:7 
da5b2bf9416c70aad5d06dae265eba518534e147a187a04f15afa34fb6e8f7b9
[root@martin-host ~]# 
[root@martin-host ~]# docker exec -ti test7 bash
[root@da5b2bf9416c /]# ping test6 
PING test6 (172.17.0.3) 56(84) bytes of data.
64 bytes from test6 (172.17.0.3): icmp_seq=1 ttl=64 time=0.146 ms
64 bytes from test6 (172.17.0.3): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from test6 (172.17.0.3): icmp_seq=3 ttl=64 time=0.047 ms
^C
--- test6 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.046/0.079/0.146/0.048 ms
[root@da5b2bf9416c /]# 
[root@da5b2bf9416c /]# 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.3	test6 7596c3b55541
172.17.0.4	da5b2bf9416c
[root@da5b2bf9416c /]# 

9、容器的资源限制 cpu/内存

[root@martin-host ~]# docker run -tid --name=test8 --cpus=2 --memory=800M centos:7 
c31b2583f8ad9954e8bf7ae63edac04def6ccabe9c599fd064c091a8de1dc278

[root@martin-host ~]# docker inspect test8 | grep -i memory
            "Memory": 838860800,
            "MemoryReservation": 0,
            "MemorySwap": 1677721600,
            "MemorySwappiness": null,
[root@martin-host ~]# docker run -tid --name=test9 --cpus=2 --memory=1G polinux/stress bash 
99808428499f719fd440722245e27f1787667bf6c45e80fb8a979f0e0855fd6a
[root@martin-host ~]#

// 登录容器,模拟产生进程 
[root@martin-host ~]# docker exec -ti test9 bash
bash-5.0# 
bash-5.0# stress --cpu 2 --io 4 --vm 2 --vm-bytes 128M --timeout 60s &
在物理机上top查看资源消耗

四、容器平台案例——部署wordpress论坛

1、部署wordpress的主库

[root@martin-host ~]# mkdir /opt/wordpress

[root@martin-host ~]# cat /opt/wordpress/master_my.cnf
[mysqld]
server_id=10
log_bin=master

[root@martin-host ~]# docker run -tid --name=wordpress_master_db --hostname=wordpress_master_db \
> --restart=always \
> --cpus=1 --memory=1G \
> -e MYSQL_ROOT_PASSWORD=redhat \
> -v /opt/wordpress/master_my.cnf:/etc/my.cnf \
> -v /opt/wordpress/master_db:/var/lib/mysql \
> mysql:5.7 

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
d54b28bd02f8   mysql:5.7   "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   3306/tcp, 33060/tcp   wordpress_master_db

2、登录主库,创建论坛需要的库、用户

[root@martin-host ~]# docker exec -ti wordpress_master_db bash
root@wordpress_master_db:/# 
root@wordpress_master_db:/# mysql -uroot -predhat
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> create database wordpress charset utf8;
Query OK, 1 row affected (0.00 sec)

mysql> create user 'wpuser'@'%' identified by 'redhat';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on wordpress.* to 'wpuser'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3、部署wordpress论坛

[root@martin-host ~]# docker run -tid --name=wordpress --hostname=wordpress \
> --restart=always \
> --cpus=2 --memory=2G \
> --link=wordpress_master_db:wordpress_master_db \
> -e WORDPRESS_DB_HOST=wordpress_master_db \
> -e WORDPRESS_DB_USER=wpuser \
> -e WORDPRESS_DB_PASSWORD=redhat \
> -e WORDPRESS_DB_NAME=wordpress \
> -e WORDPRESS_TABLE_PREFIX=wp_ \
> -v /opt/wordpress/html:/var/www/html \
> -p 9000:80 \
> wordpress

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a836434451bc   wordpress   "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    0.0.0.0:9000->80/tcp, :::9000->80/tcp   wordpress

测试访问论坛, 再使用一样的配置参数创建另外运行论坛的容器

4、再次使用相同的项目文件部署论坛

[root@martin-host ~]# docker run -tid --name=wordpress_2 --hostname=wordpress_2 --restart=always --cpus=2 --memory=2G --link=wordpress_master_db:wordpress_master_db -v /opt/wordpress/html:/var/www/html -p 9001:80 wordpress
c75caf0cdb769be2ba6f5e7ca6f10429c12e254ddaa37598bcdd0dd2b20e1d1e

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                   NAMES
c75caf0cdb76   wordpress   "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    0.0.0.0:9001->80/tcp, :::9001->80/tcp   wordpress_2

5、部署haproxy实现论坛的负载均衡

[root@martin-host ~]# docker run -tid --name=wordpress_haproxy --hostname=wordpress_haproxy \
> --restart=always \
> --cpus=2 --memory=4G \
> --link=wordpress:wordpress_1 \
> --link=wordpress_2:wordpress_2 \
> -v /opt/wordpress/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
> -p 80:8888 \
> haproxy
39111da543b9fedef69943a33dab8ac9ed57d3f58ed6868e7075d71f1dbdd4b5

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                   NAMES
39111da543b9   haproxy     "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    0.0.0.0:80->8888/tcp, :::80->8888/tcp   wordpress_haproxy

6、扩展MySQL为主从复制

[root@martin-host ~]# docker run -tid --name=wordpress_slave_db --hostname=wordpress_slave_db \
> --restart=always \
> --cpus=1 --memory=2G \
> -v /opt/wordpress/slave_db:/var/lib/mysql \
> -v /opt/wordpress/slave_my.cnf:/etc/my.cnf \
> --link=wordpress_master_db:wordpress_master_db \
> -e MYSQL_ROOT_PASSWORD=redhat \
> mysql:5.7 

[root@martin-host ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                   NAMES
08e41d61ea7e   mysql:5.7   "docker-entrypoint.s…"   5 seconds ago    Up 4 seconds    3306/tcp, 33060/tcp                     wordpress_slave_db

[root@martin-host ~]# docker exec -ti wordpress_master_db bash
root@wordpress_master_db:/# 
root@wordpress_master_db:/# mysql -uroot -predhat
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.7.35-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> create user 'repluser'@'%' identified by 'redhat';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'repluser'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

登录主库,备份数据,拷贝到从库上恢复

[root@martin-host ~]# docker exec -ti wordpress_master_db bash

root@wordpress_master_db:~# mysqldump -uroot -predhat --lock-all-tables --master-data=2 --all-databases > /wordpress.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
root@wordpress_master_db:~# 

[root@martin-host ~]# docker cp wordpress_master_db:/wordpress.sql ./
Successfully copied 3.63MB to /root/./

[root@martin-host ~]# ls
wordpress.sql

[root@martin-host ~]# docker cp wordpress.sql wordpress_slave_db:/
Successfully copied 3.63MB to wordpress_slave_db:/

建立主从复制关系

[root@martin-host ~]# docker exec -ti wordpress_slave_db bash
root@wordpress_slave_db:/# ls
bin   dev			  entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint-initdb.d  etc		 lib   media  opt  root  sbin  sys  usr  wordpress.sql
root@wordpress_slave_db:/# 
root@wordpress_slave_db:/# mysql -uroot -predhat
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> source /wordpress.sql;

mysql> CHANGE MASTER TO
    -> MASTER_HOST="wordpress_master_db",
    -> MASTER_USER="repluser",
    -> MASTER_PASSWORD="redhat",
    -> MASTER_LOG_FILE="master.000003",
    -> MASTER_LOG_POS=512877;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: wordpress_master_db
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000003
          Read_Master_Log_Pos: 512877
               Relay_Log_File: wordpress_slave_db-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 512877
              Relay_Log_Space: 537
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 10
                  Master_UUID: e6dcbcb4-4403-11ef-ba30-0242ac110002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值