一、创建容器
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)