docker
安装
更新系统
bash
sudo apt update
sudo apt -y dist-upgrade
安装docker
bash
sudo apt-get -y install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
开启远程访问api
bash
sudo vim /lib/systemd/system/docker.service
# 找到ExecStart
将 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H
# 修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# 保存退出。
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
bash
curl http://ip:2375/version
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
命令篇
查找镜像
bash
sudo docker search ubuntu
bash
sudo docker search centos
bash
sudo docker search nginx
拉取镜像
sudo docker pull 镜像名称:版本
如果不写版本号 默认版本为 latest
bash
sudo docker pull ubuntu:24.04
bash
sudo docker pull centos:centos7
bash
sudo docker pull nginx
bash
sudo docker pull mysql
bash
sudo docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
查看本地镜像
bash
sudo docker images
选项 | 说明 |
---|---|
REPOSITORY | 镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像的ID |
CREATED | 镜像创建时间 |
SIZE | 镜像的大小 |
同一个仓库源可以有多个TAG 代表这个仓库的不同个版本
系统镜像运行容器
参数说明
参数 | 说明 |
---|---|
-i | 交互式操作 即使没没有附加也会保持 STDIN 打开 |
-t | 分配伪终端 |
-d | 分离模式 在后台运行 |
/bin/bash | 使用那个shell环境 |
sh | 使用那个shell环境 |
--rm | 容器停止后自动删除容器 |
bash
sudo docker run -itd ubuntu:24.04
查看容器
sudo docker ps 查看运行中的容器
sudo docker ps -a 查看所有容器包括没有运行的容器
bash
sudo docker ps
bash
sudo docker ps -a
停止容器
bash
sudo docker stop 容器ID
bash
sudo docker kill 容器ID
启动容器
bash
sudo docker start 容器ID
进入正在运行的容器
bash
sudo docker exec -it 容器ID /bin/bash
从正在运行的容器终端退出到宿主主机
bash
exit
删除容器
删除未运行的容器
bash
sudo docker rm 容器ID
删除运行中的容器
bash
sudo docker rm -f 容器ID
删除镜像
如果不写版本号 默认版本为 latest
bash
sudo docker rmi 镜像名称:版本
指定容器名
-p 端口映射 物理主机端口:容器主机端口
--name 容器名
bash
sudo docker run -d -p 81:80 --name nginx01 nginx
容器退出时删除容器
--rm
bash
sudo docker run -d -p 82:80 --rm --name nginx02 nginx
容器重启策略
--restart=always
--restart=always 表示容器退出时,docker会总是自动重启这个容器
--restart=on-failure:3 表示容器的退出状态码非0(非正常退出),自动重启容器,3是自动重启的次数。超过3此则不重启
--restart=no 默认值,容器退出时,docker不自动重启容器
--restart=unless-stopped 表示容器退出时总是重启,但是不考虑docker守护进程运行时就已经停止的容器
bash
sudo docker run -d -p 83:80 --restart=always --name nginx03 nginx
环境变量
-e
bash
sudo docker run --rm -p 3306:3306 -p 33060:33060 \
--name mysql-test -e MYSQL_ROOT_PASSWORD=lihaozhe -itd mysql
限制CPU和内存
--cpus CPU数量
--memory 内存大小 单位 b kb m g
bash
sudo docker run -d -p 85:80 --rm --cpus 2 --memory 256m --name nginx05 nginx
bash
sudo docker stats nginx05
查看容器日志
-f 追踪实时日志
-t 现实时间戳
bash
sudo docker logs -ft nginx05
数据卷
bash
sudo docker run -d -p 86:80 --rm --name nginx06 nginx
bash
sudo docker inspect nginx06 | grep UpperDir
bash
sudo ls -l /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff
bash
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/aa
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/bb
sudo mkdir /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff/cc
bash
sudo docker exec -it nginx06 /bin/bash
bash
ls
bash
mkdir /dd
bash
exit
bash
sudo ls -l /var/lib/docker/overlay2/52bce6808bd731967bf71f820f7a5127306a84bff80a96fda5fcbd4da59f0ae3/diff
bash
sudo docker stop nginx06
当容器删除后 数据卷和容器一起被删除
匿名绑定
-v 就是 --volume
-v 容器中的路径 这就是匿名绑定
Source 物理主机路径
Destination 容器主机路径
bash"Mounts": [ { "Type": "volume", "Name": "a6c2be4750a24e2384e87a60c55961f0f2ffe4f0def0bc084ee2c77f79071e6a", "Source": "/var/lib/docker/volumes/a6c2be4750a24e2384e87a60c55961f0f2ffe4f0def0bc084ee2c77f79071e6a/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
bash
sudo docker run -d -p 10007:80 -v nginx-volume:/usr/share/nginx/html --name nginx-volume nginx
bash
sudo docker inspect nginx-volume
bash
su root
bash
cd /var/lib/docker/volumes/49114e1e1a6f6c9b57ca4c3aa380dd4b40807e389f089f0b0ed64581b27089a9/_data
bash
sudo docker volume prune
bash
ls /var/lib/docker/volumes
选项 | 说明 |
---|---|
create | 创建数据卷 |
inspect | 显示数据卷详情 |
ls | 列表方式显示数据卷 |
prune | 删除不使用的数据卷 |
rm | 删除数据卷 |
具名绑定
-v 就是 --volume
-v 数据卷名:容器中的路径 这就是具名绑定
Source 物理主机路径
Destination 容器主机路径Bind Mount
bash"Mounts": [ { "Type": "volume", "Name": "nginx-volume", "Source": "/var/lib/docker/volumes/nginx-volume/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ]
bash.
sudo docker volume create nginx-volume
bash
sudo docker volume ls
bash
sudo docker run -d -p 10008:80 -v nginx-volume:/usr/share/nginx/html --name nginx-volume nginx
bash
sudo docker inspect nginx-volume
bash
sudo docker stop nginx-volume
bash
sudo docker rm nginx-volume
bash3
sudo docker volume rm nginx-volume
bash
ls /var/lib/docker/volumes
Bind Mount
-v 就是 --volume
-v 物理机路径:容器中的路径 Bind Mount
Source 物理主机路径
Destination 容器主机路径
bash
sudo docker run --name nginx-test --rm -d -p 80:80 nginx
# 准备 nginx 容器与本地文件映射文件目录
# /home/lhz/nginx/html 存放网页文件
# /home/lhz/nginx/conf.d 存放配置文件
mkdir -p /home/lhz/nginx/html /home/lhz/nginx/conf.d
# docker cp:用于容器与主机之间的数据拷贝
# 从容器中拷贝文件到本地
sudo docker cp nginx-test:/usr/share/nginx/html /home/lhz/nginx
sudo docker cp nginx-test:/etc/nginx/conf.d/default.conf /home/lhz/nginx/conf.d
sudo docker cp nginx-test:/etc/nginx/nginx.conf /home/lhz/nginx
# 删除现有nginx容器
sudo docker stop nginx-test
bash
sudo docker run -d -p 80:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test --restart=always nginx
bash
sudo docker run -d -p 81:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test01 --restart=always nginx
bash
sudo docker run -d -p 82:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test02 --restart=always nginx
html:/usr/share/nginx/html
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf
--name nginx-test01 --restart=always nginx
```bash
sudo docker run -d -p 82:80 \
-v /home/lhz/nginx/html:/usr/share/nginx/html \
-v /home/lhz/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/lhz/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx-test02 --restart=always nginx