Skip to main content

基础使用

Docker 常用指令

开局一张图: image-20211129172616278

🛠 基础指令

指令说明示例
cp提取容器文件cp xxx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
# 容器复制文件到宿主机
docker cp my_container:/path/in/container /path/on/host

# 从宿主机复制文件到容器
docker cp /home/test/Project/app/server/code_test/* 2d9b563743bb:/app/server-eggjs/

📀 镜像管理

docker {指令}
指令说明示例
images列出当前所有镜像docker images
pull下载镜像docker pull python:3.7.5-alpine
buildDockerfile构建镜像docker build -t tagName .
rmi / image rm删除镜像docker rmi imageName/imageID

查询

# 查看当前所有镜像
docker images

# 搜索镜像
docker search mysql
docker search mariadb
curl https://registry.hub.docker.com/v1/repositories/centos/tags| tr -d '[\[\]" ]' | tr '}' '\n'\| awk -F: -v image='centos' '{if(NR!=NF && $3 != ""){printf("%s:%s\n",image,$3)}}'

重命名

# 重命名
docker tag <镜像id> <新名称:tagname>

# 删除旧的镜像引用
docker rmi <旧镜像名:tagname>

新增镜像

# 下载镜像
docker pull {imagename}

docker pull python:3.7.5-slim

构建镜像

# 指定dockerfile
docker build -t <ImageName:TagName> <dockerfilePath>
docker build -t {镜像名称:tagName} <dockerFile>

# 构建本地镜像,默认查找当前目录下的 dockerfile
docker build -t <tagName> .
docker build -t fastapi-2 .

#

删除镜像

# 删除某个image
docker rmi [image]
# 或
docker image rm [image]

# 删除所有<node>镜像
docker rmi `docker images | grep '<none>' | awk '{print $3}'` -f
# 或
docker images | grep '<none>' | awk '{print $3}' | xargs docker rmi

导出导入

基础语法:

docker save -o saveImageName.tar imageID
# or
docker save imageID > saveImageName.tar

docker save 9f4008 > ~/python:3.7.5-slim.tar
  • 导出
docker images |awk '{print $1}' |sed -n '2,$p' |xargs docker save -o images.tar
  • 导入
docker load -i images.tar

# 修复名称

🏭 容器管理

docker {指令}
指令示例用例
ps查看容器docker ps -a
run通过镜像创建并运行一个容器docker run -it --name {容器名} image command
create通过镜像创建一个容器docker create image --name xxx
start启动一个容器docker start contain_name
restart重启容器docker restart contain_name
stop停止容器docker stop contain_name
rm删除容器docker rm contain_name
cp提取文件到宿主docker cp {container-name}:{要提取的镜像文件} {宿主路径}

容器状态

docker ps # 查看所有运行中的容器
docker ps -a # 查看所有容器

# 查看容器信息,挂载信息
docker inspect 容器名称

# 查看所有挂载信息
docker volume ls

运行容器

# 通过镜像创建一个容器
docker create id|name

# 启动创建后的容器
docker start id|name

# 启动创建后的容器,并在前台使用
docker start -i id|name

# 启动创建后的容器
docker stop id|name

# 创建容器并运行
docker run image --name my_name

# 创建容器并运行,并作为当前输出
docker run -it --name my_name image /bin/bash

# 创建一个不会自动退出的容器
docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 10; done"

进入容器

# 进入容器
docker attach container_name|id /bin/bash

# 进入容器
docker exec -it container_name|id /bin/bash

attach 和 exec 的主要区别:

exec 使用 exet 退出不会将容器停止,相反 attach 会将容器停止

删除容器

# 普通删除,运行中的容器会提示删除失败
docker rm container_name|id

# 强制删除,运行中的容器也会被删除
docker rm -rf container_name|id

# 删除所有停止了的容器
docker ps -a | grep "Exited" | awk '{print $1 }'| xargs docker rm
# 或
docker rm `docker ps -a | grep 'Exited' | awk '{print $1}'` -f

停止容器

# 停止 Exited 相关的镜像
docker ps -a | grep "Exited" | awk '{print $1 }'| xargs docker stop

文件交互

  • 从宿主导入文件到容器
# 语法
docker cp <宿主本地文件绝对路径> <容器id>:<目标路径>

docker cp /tmp/temp/psd-tool/src/utils/helper.py psd-tools-test:/app/src/utils/helper.py
docker cp /tmp/temp/psd-tool/src/utils/fonts.py psd-tools-test:/app/src/utils/fonts.py

docker cp /tmp/temp/psd-tool/src/routers/v1/psd.py psd-tools-test:/app/src/routers/v1/psd.py
docker cp /tmp/temp/psd-tool/src/modules/adobe_psd.py psd-tools-test:/~/app/src/modules/adobe_psd.py


docker cp /tmp/temp/psd-tool/src/main.py psd-tools-test:/app/src/main.py
docker cp /tmp/temp/psd-tool-data/.aws psd-tools-test:/root/.aws
docker cp /tmp/temp/psd-tool/src/storages/aws_s3.py psd-tools-test:/app/src/storages/aws_s3.py

docker cp /tmp/temp/psd-tool/config.ini psd-tools-test:/app/config.ini
docker cp /tmp/temp/psd-tool/src/config.py psd-tools-test:/app/src/config.py
docker cp /tmp/temp/psd-tool/src/Types.py psd-tools-test:/app/src/Types.py
docker cp /tmp/temp/psd-tool/src/utils/adobe_api.py psd-tools-test:/app/src/utils/adobe_api.py
docker cp /tmp/temp/psd-tool/src/modules/psd_parser.py psd-tools-test:/app/src/modules/psd_parser.py
docker cp /tmp/temp/psd-tool/src/modules/psd.py psd-tools-test:/app/src/modules/psd.py
docker cp /tmp/temp/psd-tool/src/modules/adobe_psd.py psd-tools-test:/app/src/modules/adobe_psd.py
docker cp /tmp/temp/psd-tool/src/routers/v1/psd.py psd-tools-test:/app/src/routers/v1/psd.py

网络交互(容器通讯)

容器的网络交互主要通过搭建共同网络环境,或者共同宿主网络两种模式来实现

  • docker run --net=host
  • docker run --network <网络名称>

两种方法各有利弊,可以根据实际情况选用

要让容器可以互相通讯,首先要将需要通讯的容器放置于同一网络中

# 创建一个网络环境
docker network create psd-tools-network

# 方法1 通过run在创建容器时指定容器的网络环境
docker run -it --network test-network xxxxx

# 方法2 通过绑定,重新绑定容器的网络环境
# 停止容器
docker stop <容器名>

# 接触容器当前绑定的网络
docker network disconnect <网络名称> <容器名称>
docker network disconnect psd-tools psd-tools-test
docker network disconnect psd-tools psd-tools-redis

# 绑定新网络
docker network connect <网络名称> <容器名称>
docker network connect psd-tools psd-tools-test
docker network connect psd-tools psd-tools-redis

--network-alias mysql

# 绑定完成后,通过 inspect 指令查看每个容器的ip地址,重新进行关联
docker inspect <容器名>
docker inspect psd-tools-test
docker inspect psd-tools-redis

# 查看容器信息
docker inspect <容器名称/id>

🔤 命令详解

RUN

完整文档(非官方)

使用 docker run 命令可以运行容器,该命令底层其实是 docker createdocker start 两条命令的结合体,运行容器需要先基于镜像创建一个容器,然后启动容器,完成一个容器的运行

image-20221001095213159

基础语法:

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

常用参数[OPTIONS]

  • --net--network指定容器的网络模式

    • --net=host

    • --net=bridge 默认

    • --net=none 不配置任何网络

    • --net=container

    • --net=<网络名> 直接指定一个网络名称,

  • --name docker run --name="xxxx" <容器名> <命令>

    -i 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

  • -t 以交互模式运行容器,通常与 -t 同时使用

  • -d 后台运行容器,并返回容器 ID

  • -p

    # 基础格式
    docker run -p {ip:port/protocol}:{镜像对应的映射ip:端口/协议}

    # 指定所有ip均能访问
    docker run -p 0.0.0.0:8080:80 --name nginx-test {image-name}

    # 指定多个端口
    docker run -p 0.0.0.0:8080:80/tcp -p 0.0.0.0:8181:7001
  • -v

    这里把容器想成一个单独的系统,或者说电脑,而你的宿主机目录是一个 U 盘,挂载后,你往宿主机该目录里放文件,那么通过容器里对应目录便可以访问到此文件,不需要重新生成容器就可以在“容器外部”添加和修改某些文件

    默认情况下挂载的卷是读写模式:rw,可以通过添加:ro修改成只读模式,保护宿主文件

    # 挂载一个目录到镜像内
    docker run -v {宿主路径}:{镜像路径}:

    # 快速挂载当前目录到镜像
    docker run -v $(pwd):{镜像路径} image command

    # :ro只读 :rw读写
    docker run -v /name/nginx.conf:/etc/nginx/nginx.conf:ro

常用命令[COMMAND]

  • /bin/bash - 常用,直接进入终端
  • python | node |... - 如果该容器没有安装 bash,可以进入对应的后端环境

通过当前终端启动容器

# 创建容器并启动
docker run -it <容器名/id> --name=<定义一个容器名字>

# 退出
exit

# 进入已停止的容器
docker start -i <容器名/id>

CREATE

但是与 docker run -d 不同,docker create 创建的容器并未实际启动,还需要执行 docker start 命令或 docker run 命令以启动容器。

事实上,docker create 命令常用于在启动容器之前进行必要的设置。

基础语法:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

📄 Dockerfile

  • 获取镜像的 Dockerfile
docker pull image1
docker pull image2

# 获取对应镜像的dockerfile
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile

cat image1-dockerfile

🐙 Docker-Compose

Docker-Compose.yml