文章

Docker使用

Docker使用

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
# 查看Docker容器资源占用
docker stats
# 查看容器日志
docker logs CONTAINER_ID
# 进入容器
docker exec -it CONTAINER_ID /bin/bash
# 查看容器内进程
docker top CONTAINER_ID
# 捕捉退出状态码
docker wait nginx
# 从宿主机拷贝文件到容器,反之亦然
docker cp /path/on/host/file.txt container_id:/path/in/container/

镜像操作

导入内容的不同: docker load 命令可以将一个或多个 tar 文件中的镜像层级结构和元数据加载到 Docker 中,以创建镜像。这些 tar 文件通常时使用 docker save 命令导出的。当使用 docker load 命令时,所有的镜像层级结构和元数据都被导入到Docker中,以创建完整的镜像。

docker import 命令可以将一个 tar 文件中文件系统导入到 Docker 中,以创建一个新的镜像。这个 tar 文件通常是使用 docker export 命令导出的容器文件系统。当使用 docker import 命令时,仅仅将容器的文件系统导入到 Docker 中,并将其转化为一个新的镜像。

总结:

如果需要导入整个镜像,包括镜像层级结构和元数据,则应该使用 docker load 命令。 如果只需要导入容器的文件系统,并将其转化为一个新的镜像,则可以使用 docker import 命令。

1
2
3
4
5
6
7
8
9
10
11
# 导出容器镜像
docker export nginx nginx.tar
# 导入容器镜像
docker import nginx.tar

# 提交本地镜像
docker commit nginx nginx-test
# 保存镜像
docker save nginx-test > nginx.tar
# 加载镜像
docker load < nginx.tar

资源限制

CPU

1. CPU 核心数限制

  • --cpus: 限制容器可以使用的 CPU 核心数。

    1
    
    docker run --cpus="1.5" ubuntu  
    

2. CPU 分享值(CPU Shares)

  • --cpu-shares-c: 设置容器的 CPU 分享值,用于相对权重分配。

    1
    
    docker run --cpu-shares=512 ubuntu  
    

3. CPU 调度周期和配额

  • --cpu-period--cpu-quota: 通过设置 CPU 调度周期和配额来限制 CPU 使用。

    1
    
    docker run --cpu-period=100000 --cpu-quota=50000 ubuntu  
    

内存

1. 内存大小限制

  • -m--memory: 限制容器可以使用的内存大小。

    1
    
    docker run -m="500M" ubuntu  
    

2. 内存和交换空间总和限制

  • --memory-swap: 限制容器可以使用的内存和交换空间的总和。

    1
    
    docker run -m="500M" --memory-swap="1G" ubuntu  
    

存储资源限制

1. 存储大小限制

  • --storage-opt: 限制容器的存储资源使用。

    1
    
    docker run --storage-opt size=500M ubuntu  
    

网络资源限制

1. 网络配置

  • --network: 指定容器使用的网络。

    1
    
    docker run --network=custom_network ubuntu  
    

2. MAC 地址设置

  • --mac-address: 设置容器的 MAC 地址。

    1
    
    docker run --mac-address="02:42:ac:11:00:01" ubuntu  
    

I/O 资源限制

1. 设备读写速度限制

  • --device-read-bps--device-write-bps: 限制设备的读写速度。

    1
    
    docker run --device-read-bps=/dev/sda:1mb --device-write-bps=/dev/sda:1mb ubuntu  
    

2. 设备读写 IOPS 限制

  • --device-read-iops--device-write-iops: 限制设备的读写 IOPS。

    1
    
    docker run --device-read-iops=/dev/sda:1000 --device-write-iops=/dev/sda:1000 ubuntu  
    

volume

匿名绑定
1
docker run -d --name nginx --rm -p 80:80 -v /usr/share/nginx/html nginx

容器删除后数据卷会随之删除

实名绑定
1
docker run -d --name nginx --rm -p 80:80 -v nginx:/usr/share/nginx/html nginx

容器删除后数据卷不会删除

文件夹映射
1
docker run -d --name nginx --rm -p 80:80 -v /www/nginx:/usr/share/nginx/html nginx

Network

bridge模式

image-20241106234724618

可以使用--link单向链接到指定容器

Host模式

image-20241106235005342

container模式

image-20241106235453813

自定义网络
1
docker network create --driver bridge --subnet 10.1.2.0/24 --gateway 10.1.2.1 demo
1
docker run -itd --network demo --rm --name centos1 centos

两台容器都链接上互相ping:

image-20241107000903703

不同网络的链接问题

image-20241107002940480

image-20241107002508643

本质上相当于为容器1新链接了一个网卡

Dockerfile

示例

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
26
27
28
29
30
31
32
# 基础镜像
FROM centos

# 作者信息
MAINTAINER masterke<masterke.cn>

# 标签
LABEL version="1.0"
LABEL description="我的第一个Dockerfile"

# 环境变量
ENV JAVA_ENV=dev APP_NAME=test

# 要执行的shell命令
RUN mkdir -p /www/dockerfile/test

# 将主机指定文件复制到容器目标位置
ADD /etc/hosts /etc/hosts

# 设置容器中的工作目录,如果目录不存在将会自动创建
WORKDIR /the/workdir/path
RUN pwd

# 数据卷绑定
VOLUME [ "/www/docekrfile/test" ]

# 暴露端口
EXPOSE 80/tcp

# CMD(会被覆盖)和ENTRYPOINT(不会被覆盖)任选其一,构建完成后执行的命令
CMD ping 127.0.0.1
ENTRYPOINT ping 127.0.0.1

CMD与ENTRYPOINT的区别

如果创建容器的时候加了启动命令,那么Dockerfile里写的如果是CMD就会被替代掉,如果写的是ENTRYPOINT那两条命令都会执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
如果Dockerfile是:
======================
FROM centos:7
CMD ["/usr/bin/echo","我是Dockerfile的CMD"]
======================
那么:
[root@rocky cmdtest]# docker run --rm -it cmdtest echo "我是创建的时候指定的命令"
我是创建的时候指定的命令

如果Dockerfile是:
======================
FROM centos:7
ENTRYPOINT ["/usr/bin/echo","我是Dockerfile的CMD"]
======================
[root@rocky cmdtest]# docker run --rm -it cmdtest echo "我是创建的时候指定的命令"
我是Dockerfile的CMD echo 我是创建的时候指定的命令

镜像优化

  • 删除yum缓存:yum clean all
  • RUN命令要尽量写在一条里。
  • 选择比较小的基础镜像:alpine

镜像仓库

阿里云私有镜像服务
1
https://cr.console.aliyun.com/cn-hangzhou/instances
Harbor镜像仓库
Nexus镜像仓库

Docker-compose

https://www.runoob.com/docker/docker-compose.html

1
2
3
4
5
6
7
8
9
10
11
12
version: '1.0'
services:
  nginx-demo:
    image: nginx:latest
    container_name: my_nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - /opt/nginx:/usr/share/nginx/html
    environment:
      - APP_ENV=dev
本文由作者按照 CC BY 4.0 进行授权