一:docker安装
docker官网安装文档:https://docs.docker.com/engine/install/centos/
1.yum安装: yum -y install docker
2.rpm安装:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
找到最新的rpm包,然后:yum -y install docker-ce-20.10.19-3.el7.x86_64.rpm
运行docker:systemctl start docker
验证:docker run hello-world
3.二进制安装:
https://download.docker.com/linux/static/stable/x86_64/
找到最新包并且下载
解压:tar -zxvf docker-20.10.3.tgz
进入解压的目录中:cp docker/* /usr/bin/
运行docker:systemctl start docker
验证:docker run hello-world
设置docker开机启动
vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
加载配置:systemctl daemon-reload
加入自启动:systemctl enable docker.service
启动docker:systemctl start docker
docker配置阿里云镜像加速:
地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
sudo systemctl daemon-reload
sudo systemctl restart docker
二:docker的使用
1.docker启动nginx,将宿主机的8080映射到容器内nginx的80端口
拉取镜像:docker pull nginx
启动镜像:docker run -d --name nginx_test1 -p8080:80 nginx
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx_test
[root@localhost ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 75012/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 47874/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1201/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1649/master
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 109047/zabbix_agent
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 109244/zabbix_serve
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 120532/php-fpm: mas
tcp6 0 0 :::8080 :::* LISTEN 43178/docker-proxy-
tcp6 0 0 :::22 :::* LISTEN 1201/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1649/master
tcp6 0 0 :::10050 :::* LISTEN 109047/zabbix_agent
tcp6 0 0 :::10051 :::* LISTEN 109244/zabbix_serve
udp 0 0 127.0.0.1:323 0.0.0.0:* 842/chronyd
udp6 0 0 ::1:323 :::* 842/chronyd
相关命令:
1.查看正在运行的镜像(容器)
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 7 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp nginx_test
2.查看所有的镜像(容器),包括停止的
[root@localhost ~]# docker ps -a #docker ps --all的简写
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 9 minutes ago Up 9 minutes 0.0.0.0:8080->80/tcp nginx_test
221d4db980cb hello-world "/hello" 4 days ago Exited (0) 4 days ago boring_goldstine
9f26757c16f4 docker.io/nginx "/docker-entrypoin..." 4 days ago Exited (1) 4 days ago elated_wing
3.如果想删除正在运行一个镜像,需要先停掉所在的容器,然后再删除容器,再删除镜像
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 6 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp nginx_test
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 21 minutes ago Up 21 minutes 0.0.0.0:8080->80/tcp nginx_test
221d4db980cb hello-world "/hello" 4 days ago Exited (0) 4 days ago boring_goldstine
9f26757c16f4 docker.io/nginx "/docker-entrypoin..." 4 days ago Exited (1) 4 days ago elated_wing
停止容器:
[root@localhost ~]# docker stop 221d4db980cb #如果镜像没有运行,可以不执行这步
221d4db980cb
删除容器:
[root@localhost ~]# docker container rm 221d4db980cb
221d4db980cb
删除镜像:
[root@localhost ~]# docker image rm hello-world
Untagged: hello-world:latest
Untagged: docker.io/hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
1.强制删除镜像:
docker image rm -f hello-world
简写:docker rmi -f +镜像id
2.强制删除容器:
dcoker rm -f +容器id
3.查看镜像/容器/数据卷空间:
docker system df
4.运行容器:
docker run -itd --name nginx-test01 -p 8080:80 nginx
以交互模式后台运行容,进入容器退出后不会关闭容器
5.进入容器内部:
docker exec -it 容器id bash
6.导出镜像:
docker export 容器id > test.tar
7.保存镜像:
docker save -o test.tar 镜像Id
8.导入镜像
docker import test.tar test01
指定导入镜像
docker load -i test.tar
9.列出正在运行的镜像:
docker ps
10.列出所有的镜像,运行和没有运行的:
docker ps -a
11.列出所有拉取的镜像:
docker images
保存镜像:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." About an hour ago Up About an hour 0.0.0.0:8080->80/tcp nginx_test
9f26757c16f4 docker.io/nginx "/docker-entrypoin..." 5 days ago Exited (1) 5 days ago elated_wing
[root@localhost ~]# docker save -o nginx.tar docker.io/nginx
[root@localhost ~]# ls
anaconda-ks.cfg nginx.tar wget-log
启动已经停止的容器:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 2 hours ago Exited (0) 19 minutes ago nginx_test
9f26757c16f4 docker.io/nginx "/docker-entrypoin..." 5 days ago Exited (1) 5 days ago elated_wing
[root@localhost ~]# docker container start 8d2d3a4b246b
8d2d3a4b246b
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d2d3a4b246b nginx "/docker-entrypoin..." 2 hours ago Up 7 seconds 0.0.0.0:8080->80/tcp nginx_test
相关的报错:
[root@localhost ~]# docker run -d --name nginx-test -p 8081:80 nginx
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/nginx-test" is already in use by container 002858b8c5ff615c5d98f47a6dd11956b055dd24b8a5616cadced36635cdbb67. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.
[root@localhost ~]# docker stop 002858b8c5ff615c5d98f47a6dd11956b055dd24b8a5616cadced36635cdbb67
002858b8c5ff615c5d98f47a6dd11956b055dd24b8a5616cadced36635cdbb67
[root@localhost ~]# docker container rm 002858b8c5ff615c5d98f47a6dd11956b055dd24b8a5616cadced36635cdbb67
002858b8c5ff615c5d98f47a6dd11956b055dd24b8a5616cadced36635cdbb67
[root@localhost ~]# docker run -d --name nginx-test -p 8081:80 nginx
5c3c986da3c23d33b3d04a27e2ca0427341e2be18d67f640d2751a6421790068
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c3c986da3c2 nginx "/docker-entrypoin..." 4 seconds ago Up 3 seconds 0.0.0.0:8081->80/tcp nginx-test
[root@localhost ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 75012/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 47874/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1201/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1649/master
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 109047/zabbix_agent
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 109244/zabbix_serve
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 120532/php-fpm: mas
tcp6 0 0 :::8081 :::* LISTEN 128619/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1201/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1649/master
tcp6 0 0 :::10050 :::* LISTEN 109047/zabbix_agent
tcp6 0 0 :::10051 :::* LISTEN 109244/zabbix_serve
udp 0 0 127.0.0.1:323 0.0.0.0:* 842/chronyd
udp6 0 0 ::1:323 :::* 842/chronyd
docker 后台启动+目录挂载+映射端口
Docker可以映射文件,并且映射的文件必须存在,如果不存在,会认为是目录。映射的文件内容会传递到容器,并不是将镜像中现有的文件复制出来。所以,如果需要映射单个文件,需要先编辑好并放置在目录中
docker run -itd -v 主机目录:容器内目录
[root@localhost docker]# docker run -itd --name nginx_1 -p 8082:80 -v /usr/local/docker/nginx:/etc/nginx/conf.d/ nginx
313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313d6d3dfd42 nginx "/docker-entrypoin..." 3 seconds ago Up 3 seconds 0.0.0.0:8082->80/tcp nginx_1
验证:docker inspect 容器id
注意:如果映射地址有问题需要修改config.v2.json和hostconfig.json两个文件的对应的地址
[root@localhost docker]# cd /var/lib/docker/containers/
[root@localhost containers]# ls
313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d
[root@localhost containers]# cd 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d/
[root@localhost 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d]# ll
总用量 24
drwx------ 2 root root 6 2月 24 16:19 checkpoints
-rw-r--r-- 1 root root 2989 2月 27 18:14 config.v2.json
-rw-r--r-- 1 root root 1209 2月 27 18:14 hostconfig.json
-rw-r--r-- 1 root root 13 2月 27 18:14 hostname
-rw-r--r-- 1 root root 174 2月 27 18:14 hosts
-rw-r--r-- 1 root root 76 2月 27 18:14 resolv.conf
-rw-r--r-- 1 root root 71 2月 27 18:14 resolv.conf.hash
drwxr-xr-x 3 root root 18 2月 27 18:14 secrets
drwxrwxrwt 2 root root 40 2月 27 18:14 shm
1.先停止容器
[root@localhost 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313d6d3dfd42 nginx "/docker-entrypoin..." 3 days ago Up 20 hours 0.0.0.0:8082->80/tcp nginx_1
[root@localhost 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d]# docker stop 313d6d3dfd42
313d6d3dfd42
[root@localhost 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313d6d3dfd42 nginx "/docker-entrypoin..." 3 days ago Exited (0) 2 seconds ago nginx_1
2.编辑config.v2.json
注意:在编辑的时候可能会出现配置文件堆在一起,没有格式
需要在编辑的时候输入:%!python -m json.tool
3.编辑hostconfig.json
注意:在编辑的时候可能会出现配置文件堆在一起,没有格式
需要在编辑的时候输入:%!python -m json.tool
4.启动容器
[root@localhost 313d6d3dfd42692773bb6cbdce98494b154bfdb65e3a5b630c157d1c61aad46d]# docker start 313d6d3dfd42
dockerfile
FROM # 基础镜镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤: tomcat镜像,这个tomcat压缩包! 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ENV # 构建的时候设置环境变量
docker 网络
自定义网络
--driver 指定网络模式
--subnet 指定ip/ip段
--gateway 指定网关
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
启动四个个nginx,在启动的过程中两个加上自定义的网络,两个不加
nginx-1 加自定义网络mynet
nginx-2 加自定义网络mynet
nginx-01 不加自己网络mynet,默认启动
nginx-02 不加自己网络mynet,默认启动
如果想nginx-1和nginx-01可以通讯,需要如下配置
[root@localhost ~]# docker network connect mynet nginx-01