Docker学习
2025-03-18 21:58:02

Docker学习

Docker 命令集合:‌⁠‬⁠‌‌⁠‌‬‬‌‍‬‌⁠⁠‌‍‬⁠⁠‌安装Docker - 飞书云文档

csdn 将docker添加到用户组

Ubuntu22 安装

参考:Ubuntu22 安装

  • 卸载旧版本

    1
    apt-get remove docker docker-engine docker.io containerd runc
  • 更新软件包

    1
    2
    sudo apt update
    sudo apt upgrade
  • 安装docker依赖

    1
    apt-get install ca-certificates curl gnupg lsb-release
  • 添加Docker官方GPG密钥

    1
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  • 添加Docker软件源

    1
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  • 安装docker

    1
    apt-get install docker-ce docker-ce-cli containerd.io
  • 配置用户组(可选)

    1
    2
    3
    4
    sudo usermod -aG docker $USER
    # 应用完之后可以刷新docker组权限或logout重登账号刷新权限
    newgrp docker
    logout

换源:

  • 可用源

    阿里云:https://registry.cn-hangzhou.aliyuncs.com
    腾讯云:https://mirrors.tencent.com/docker
    华为云:https://mirror.ccs.tencent.com/dockerhub
    中国科技大学:https://docker.mirrors.ustc.edu.cn/
    豆瓣(Douban):https://dockerhub.douban.com/

  • 换源

    打开或创建daemon.json文件。这个文件通常位于/etc/docker/目录下,如果没有创建daemon.json文件就自己创建一下。编辑daemon.json

    1
    sudo vim /etc/docker/daemon.json

    daemon.json 文件中添加以下内容,将 MIRRORS 替换为你选择的镜像源:

    1
    2
    3
    {
    "registry-mirrors": ["https://MIRRORS.mirror.com"]
    }

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    {
    "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
    ]
    }

    # 有用:
    {
    "max-concurrent-downloads": 10,
    "max-concurrent-uploads": 5,
    "default-shm-size": "1G",
    "debug": true,
    "experimental": false,
    "registry-mirrors":[
    "https://x9r52uz5.mirror.aliyuncs.com",
    "https://dockerhub.icu",
    "https://docker.chenby.cn",
    "https://docker.1panel.live",
    "https://docker.awsl9527.cn",
    "https://docker.anyhub.us.kg",
    "https://dhub.kubesre.xyz"
    ]
    }
  • 保存重启

  • 其他可能操作:

    编辑 /etc/resolv.conf 文件,添加以下内容:

    1
    2
    nameserver 8.8.8.8
    nameserver 8.8.4.4

    重启docker

    1
    2
    sudo docker daemon-reload
    sudo systemctl restart docker

安装后尝试运行:

  • 运行
1
systemctl start docker
  • 安装工具
1
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  • 重启docker
1
service docker restart
  • 验证是否成功
1
sudo docker run hello-world

常见命令

镜像管理

1
2
3
4
5
6
7
8
9
10
11
# 1 下载、上传
docker pull [image]
docker push [image]

# 2 保存、导入
docker save [image] -o [FILE]
docker load -i [FILE]
docker commit [container] [image] # 从容器创建镜像

# 3 删除
docker image rm [image]

容器管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建、开始、停止、重启、查看、删除
docker create [image]
docker start [container]
docker stop [container]
docker restart [container]
docker container ls # -a 表示查看所有容器,包括未运行的
docker container rm [container]

# bash交互进入容器
docker exec -it [container] bash

# 容器创建并运行
docker run
# 参数:
--name [image] [container]
-d # 后台运行
-p [hostPort]:[containerPort] # 端口映射
-e [key=value] # 环境变量
-w [PATH] # 指定工作目录

# 范例
docker run -it -p 3316:3306 -v /data:/data -d --name mysql mysql:latest
#创建⼀个mysql容器,后台模式启动,主机3316端⼝,映射到容器3306端⼝,主机/data⽬录映射到容器/data⽬录

数据卷

命令 说明
docker volume create 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 范例
docker run -d -v [VOLUME_NAME]:[CONTAINER_PATH] [IMAGE]
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data

# 直接挂载特定目标(导致强耦合)
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

# 从.mount中可以查看容器的挂载状况;从.config/volume中可以查看简略挂载状况
docker inspect [container]

网络管理

1
2
# 创建容器时就加入某个网络
docker run -d --name mysql --network [netname] mysql
命令 说明
docker network create [netname] 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息

Docker File

dockerfile是用来指定镜像结构的,镜像结构是一种层结构,下层往往是上层的依赖或环境。一般的镜像结构可以分为:系统层、环境变量层、编程环境层、应用层。

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

在已经打包的镜像进一步制作镜像:

1
2
3
4
5
6
7
8
9
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建镜像:

1
2
# 直接指定Dockerfile目录
docker build -t docker-demo:1.0 /root/demo