chiachan
chiachan
Published on 2025-03-21 / 15 Visits
0

docker通关攻略 - 基础

docker通关攻略 - 基础

一、架构

docker structrue

介绍
Docker Damon 即dockerd,用来监听 Docker API 的请求和管理 Docker 对象,比如镜像、容器、网络和 Volume。
Docker Client 即我们常说的docker命令,是我们和 Docker 进行交互的最主要的方式方法,比如我们可以通过 docker run 命令来运行一个容器,然后我们的这个 client 会把命令发送给上面的 Dockerd,让他来做真正事情。
Docker Registry 用来存储 Docker 镜像的仓库
Images 镜像,镜像是一个只读模板,带有创建 Docker 容器的说明,一般来说的,镜像会基于另外的一些基础镜像并加上一些额外的自定义功能。比如,你可以构建一个基于 Centos 的镜像,然后在这个基础镜像上面安装一个 Nginx 服务器,这样就可以构成一个属于我们自己的镜像了。
Containers 容器,容器是一个镜像的可运行的实例,可以使用 Docker REST API 或者 CLI 来操作容器,容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 ​root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间​。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

二、基本操作

1) 镜像

1. 获取镜像

$ docker pull [OPTIONS] [Docker Registry Address[:Port]]NAME[:TAG|@DIGEST]

2. 列出镜像

$ docker image ls

3. 删除镜像

$ docker rmi [OPTIONS] IMAGE [IMAGE...]

4. 推送镜像到仓库

# 修改镜像名
$ docker tag <镜像名>:<标签> <远程仓库用户>/<镜像名>:<标签>
# 推送到远程仓库
$ docker push <远程仓库用户>/<镜像名>:<标签>

5. 迁移镜像

# 保存镜像  文件名建议使用 镜像名-标签.tar.gz
$ docker save <镜像名:标签>  | gzip > <文件名.tar.gz>

# 加载镜像
$ docker load -i <文件名.tar.gz>

利用pv管道合并命令

docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'

2) 容器

1. 运行容器

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

2. 列出容器

$ docker ps [OPTIONS]

3. 启动/停止容器

# 启动
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
# 停止
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 重启
$ docker restart [OPTIONS] CONTAINER [CONTAINER...]

4. 删除容器

$ docker rm [OPTIONS] CONTAINER [CONTAINER...]

查看镜像、容器、数据卷所占用的空间。

$ docker system df

5. 容器内外拷贝数据

docker cp 命令用于在 Docker 容器和宿主机之间复制文件或目录。

$ docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
  • ​SRC_PATH: 源路径(可以是容器内的路径或宿主机的路径)。
  • ​CONTAINER: 容器的名称或 ID。
  • ​DEST_PATH: 目标路径(可以是容器内的路径或宿主机的路径)。
# 从容器复制文件到宿主机
$ docker cp my_container:/path/in/container /path/on/host

# 从宿主机复制文件到容器
$ docker cp /path/on/host my_container:/path/in/container

# 从容器复制目录到宿主机
$ docker cp my_container:/path/in/container /path/on/host

# **从宿主机复制目录到容器**
$ docker cp /path/on/host my_container:/path/in/container

3) dockerfile

具体见 docker通关攻略 - Dockerfile

4) 数据共享和持久化

在容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 挂载主机目录 (Bind mounts)

1. 数据卷

数据卷是一个可供一个或多个容器使用的特殊目录。可以在容器之间共享和重用

# 创建数据卷
$ docker volume create my-vol

# 列出数据卷
$ docker volume ls
local               my-vol

# 查询数据卷信息
$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

# 挂在数据卷,-v或--mount命令都可以,建议使用--mount
$ docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

# 查看容器信息,也见到挂架数据卷的信息
$ docker inspect web
...
"Mounts": [
    {
        "Type": "volume",
        "Name": "my-vol",
        "Source": "/var/lib/docker/volumes/my-vol/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
...



# 删除数据卷
$ docker volume rm my-vol

# 清理空闲且无用的数据卷
$ docker volume prune

2. 挂在主机目录或文件

# 挂在主机目录,-v或--mount命令都可以,建议使用--mount
$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

# 只读
$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
    training/webapp \
    python app.py

5) 网络模式

# 列出所有docker网络
$ docker network ls

# 创建一个bridge模式的docker网络
$ docker network create -d bridge my-net

1. Bridge模式

在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
docker0子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的​默认网关​。

# 运行一个容器并连接到新建的 my-net 网络(bridge网络模式)
$ docker run -it --rm --name busybox1 --network my-net busybox sh

2. Host 模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个 Network Namespace。使用宿主机的 IP 和端口。

# 运行一个容器(host网络模式)即共享宿主机IP
$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3

3. Container 模式

指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。即与一个指定的容器共享 IP、端口范围等

# 运行一个容器(container网络模式)即docker_bri1和docker_con1两个容器共享一个ip,ip在docker_bri1创建时分配
$ docker run -tid --net=container:docker_bri1 \
              --name docker_con1 ubuntu-base:v3

4. None模式

Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。
即没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

$ docker run -tid --net=none --name \
                docker_non1 ubuntu-base:v3

参考文献