Docker 基本使用
安装或删除 Docker
安装桌面版:
https://www.docker.com/products/docker-desktop
安装服务器版:
https://docs.docker.com/engine/install/
1、删除所有非官方软件包:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update3、安装 Docker 包
若要安装最新版本,请运行:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin若要安装特定版本的 Docker Engine,请首先在存储库中列出可用版本:
# 最后可用版本: apt-cache madison docker-ce | awk '{ print $3 }' 5:24.0.0-1~debian.11~bullseye 5:23.0.6-1~debian.11~bullseye ...选择所需的版本并安装:
VERSION_STRING=5:24.0.0-1~debian.11~bullseye sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
4、通过运行 hello-world 映像来验证安装是否成功:
sudo docker run hello-world此命令下载测试映像并在容器中运行它。当容器运行时,它会打印确认消息并退出。
卸载 Docker Engine:
1、卸载 Docker Engine、CLI、containerd 和 Docker Compose 包:
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras2、主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷,请执行以下操作:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerdYou have to delete any edited configuration files manually. 您必须手动删除任何编辑的配置文件。
查看状态、启动停止
启动 docker 服务:systemctl start docker.service
设置开机启动:systemctl enable docker.service
查看 docker 状态:systemctl status docker.service
停止 docker 服务:systemctl stop docker.service
查看 docker 版本:docker version
非 root 用户运行 Docker
https://docs.docker.com/engine/install/linux-postinstall
1、添加docker用户组:sudo groupadd docker
执行以上命令会提示已存在,原因是在安装docker时已自动创建。
2、将指定用户添加到用户组($USER 为你的用户名):sudo usermod -aG docker $USER
3、查看是否添加成功:cat /etc/group | grep ^docker
4、注销并重新登录,以便重新评估您的组成员身份。
如果在虚拟机中运行 Linux,则可能需要重新启动虚拟机才能使更改生效。
5、您还可以运行以下命令来激活对组的更改:
newgrp docker6、验证是否可以在没有 docker sudo .
docker run hello-world此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。
7、如果在将用户添加到 docker 组之前最初运行 sudo Docker CLI 命令,则可能会看到以下错误:
WARNING: Error loading config file: /home/user/.docker/config.json stat /home/user/.docker/config.json: permission denied此错误表示 ~/.docker/ 目录的权限设置不正确,因为之前使用了该 sudo 命令。
若要解决此问题,请删除 ~/.docker/ 目录(它会自动重新创建,但任何自定义设置都会丢失),或者使用以下命令更改其所有权和权限:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -RDocker 命令
# 查看镜像列表,-a: 列出本地所有的镜像,-q: 只显示镜像ID
docker images -a
# 搜索镜像,或者到 https://hub.docker.com/
docker search [OPTIONS] TERM
#删除一个镜像,-f: 强制删除
docker rmi -f 镜像名/镜像ID
#删除多个镜像 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID ...
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
# 显示所有的容器,-a: 包括未运行的
docker ps -a
# 删除指定 id 的容器
docker rm container-id
docker stop/start container-id # 停止/启动指定 id 的容器
docker volume ls # 查看 volume 列表
docker network ls # 查看网络列表目录挂载
https://docker.easydoc.net/doc/81170005/cCewZWoN/kze7f0ZR

几种挂载方式
bind mount直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上volume由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上tmpfs mount适合存储临时文件,存宿主机内存中。不可多容器共享。
bind mount 方式 --mount type=bind,source=/tmp,target=/usr
volume 方式 -v /tmp:/usr
文档参考:https://docs.docker.com/storage/、https://www.cnblogs.com/ittranslator/p/13352727.html
示例:
docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1
注意! 因为挂载后,容器里的代码就会替换为你本机的代码了,如果你代码目录没有
node_modules目录,你需要在代码目录执行下npm install --registry=https://registry.npm.taobao.org确保依赖库都已经安装,否则可能会提示“Error: Cannot find module ‘koa’” 如果你的电脑没有安装 nodejs,你需要安装一下才能执行上面的命令。
Docker compose
在 Compose V2 中,docker-compose 命令已经不适用,应该用 docker compose 来替代前面命令。
要把项目依赖的多个服务集合到一起,我们需要编写一个docker-compose.yml文件,描述依赖哪些服务
参考文档:https://docs.docker.com/compose/
在docker-compose.yml 文件所在目录,执行:docker-compose up就可以跑起来了。
命令参考:https://docs.docker.com/compose/reference/up/
在后台运行只需要加一个 -d 参数docker compose up -d
查看运行状态:docker compose ps
停止运行:docker compose stop
重启:docker compose restart
重启单个服务:docker compose restart service-name
进入容器命令行:docker compose exec service-name sh
查看容器运行log:docker compose logs [service-name]
用 docker-compose 构建 alist 服务
创建 docker-compose.yaml,并使用 docker compose up 启动应用程序(后台运行服务在末尾加 -d)
version: '3.3'
services:
alist:
restart: always
volumes:
- '/etc/alist:/opt/alist/data'
ports:
- '5244:5244'
environment:
- PUID=0
- PGID=0
- UMASK=022
container_name: alist
image: 'xhofe/alist:latest'# 随机生成一个密码
docker exec -it alist ./alist admin random
# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码
docker exec -it alist ./alist admin set NEW_PASSWORDdocker-compose 更新:
1.docker-compose pull
2.docker-compose up -dDocker web 安装配置
[root@localhost ~]# docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c078f0f41285 docker.io/uifd/ui-for-docker "/ui-for-docker" 4 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp docker-web
[root@localhost ~]# vim /etc/sysconfig/iptables
......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9000 -j ACCEPT
[root@localhost ~]# systemctl restart iptables.service多容器通信
https://docker.easydoc.net/doc/81170005/cCewZWoN/U7u8rjzF
创建一个名为test-net的网络:
docker network create test-net运行 Redis 在 test-net 网络中,别名redis,这个服务在这个网络中的主机名就是redis了
docker run -d --name redis --network test-net --network-alias redis redis:latest修改代码中访问redis的地址为网络别名
const redis = require('redis');
let rds = redis.createClient({url: "redis://redis:6379"});
rds.on('connect', () => console.log('redis connect ok'));
rds.connect();运行 Web 项目,使用同个网络
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1查看数据
http://localhost:8080/redis
Docker 开启 ipv6 配置
/etc/docker/daemon.json
{
"experimental": true,
"ipv6": true,
"ip6tables": true,
"fixed-cidr-v6": "2408:821b:9f2f:aa20:1000::/80"
}Docker 四种网络模式
(后面附上以指定网络模式开启nginx的命令)
1.host模式
容器和宿主机共享network,这时候localhost就可以访问宿主机端口了。
docker run -d --network host --name nginx
2.container模式
容器A和容器B共享network,就是说容器之间可以通过localhost直接访问。
docker run -d --network container --name nginx
3.none模式
容器与宿主机隔绝,不能联网,安全性最高,一般很少用到。
docker run -d --network none --name nginx
4.bridge模式(默认模式)
每个容器有自己的network,通过localhost访问不到宿主机
docker run -d --name nginx