Hublog随手记录一些东西

Docker 基本使用

安装或删除 Docker

安装桌面版:

https://www.docker.com/products/docker-desktop

安装服务器版:

https://docs.docker.com/engine/install/

1、删除所有非官方软件包:

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

2、debian 使用 apt 存储库安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 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 update

3、安装 Docker 包

  1. 若要安装最新版本,请运行:

    1
    
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  2. 若要安装特定版本的 Docker Engine,请首先在存储库中列出可用版本:

    1
    2
    3
    4
    5
    6
    
    # 最后可用版本:
    apt-cache madison docker-ce | awk '{ print $3 }'
    
    5:24.0.0-1~debian.11~bullseye
    5:23.0.6-1~debian.11~bullseye
    ...

    选择所需的版本并安装:

    1
    2
    
    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 映像来验证安装是否成功:

1
sudo docker run hello-world

此命令下载测试映像并在容器中运行它。当容器运行时,它会打印确认消息并退出。

卸载 Docker Engine:

1、卸载 Docker Engine、CLI、containerd 和 Docker Compose 包:

1
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

2、主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷,请执行以下操作:

1
2
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

You have to delete any edited configuration files manually. 您必须手动删除任何编辑的配置文件。

查看状态、启动停止

  1. 启动 docker 服务:systemctl start docker.service

  2. 设置开机启动:systemctl enable docker.service

  3. 查看 docker 状态:systemctl status docker.service

  4. 停止 docker 服务:systemctl stop docker.service

  5. 查看 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、您还可以运行以下命令来激活对组的更改:

1
newgrp docker

6、验证是否可以在没有 docker sudo .

1
docker run hello-world

此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

7、如果在将用户添加到 docker 组之前最初运行 sudo Docker CLI 命令,则可能会看到以下错误:

1
WARNING: Error loading config file: /home/user/.docker/config.json stat /home/user/.docker/config.json: permission denied

此错误表示 ~/.docker/ 目录的权限设置不正确,因为之前使用了该 sudo 命令。

若要解决此问题,请删除 ~/.docker/ 目录(它会自动重新创建,但任何自定义设置都会丢失),或者使用以下命令更改其所有权和权限:

1
2
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

Docker 命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看镜像列表,-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

docker host

几种挂载方式

  • 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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'
1
2
3
4
# 随机生成一个密码
docker exec -it alist ./alist admin random
# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码
docker exec -it alist ./alist admin set NEW_PASSWORD

docker-compose 更新:

1
2
1.docker-compose pull
2.docker-compose up -d

Docker web 安装配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[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的网络:

1
docker network create test-net

运行 Redis 在 test-net 网络中,别名redis,这个服务在这个网络中的主机名就是redis

1
docker run -d --name redis --network test-net --network-alias redis redis:latest

修改代码中访问redis的地址为网络别名

1
2
3
4
const redis = require('redis');
let rds = redis.createClient({url: "redis://redis:6379"});
rds.on('connect', () => console.log('redis connect ok'));
rds.connect();

运行 Web 项目,使用同个网络

1
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

1
2
3
4
5
6
{ 
 "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

0%