Featured image of post 容器(2):docker最佳实践指南——docker-compose和Portainer

容器(2):docker最佳实践指南——docker-compose和Portainer

使用docker的最佳方法——利用docker-compose和Portainer管理容器

缘起

“容器(1):容器相关知识简介——容器化、docker、docker-compose、Kubernetes / K8s等”中,我们介绍了容器化的概念,以及如何使用Docker进行容器化。在实际使用Docker时,我们可能会遇到一些问题,例如:

  • 当我们运行多个容器之后,如何清晰地知道这些容器都在哪里、运行状态如何?
  • 当我们需要更新容器时,如何保证更新的容器和原来的容器一致?
  • 当我们需要运行多个容器时,如何保证这些容器之间的依赖关系?

最开始我在使用docker时,有些容器是用docker run命令启动的,有些容器是用docker-compose启动的,docker-compose.yml文件放置的位置也不统一,导致我在管理这些容器时非常混乱。后来我重新整理了一下,将所有容器都用docker-compose启动,并将docker-compose.yml文件统一放置在一个目录下,这样管理起来就方便多了。

当然,这里称之为“最佳实践指南”可能有些夸张,但这的确是现阶段我觉得最好的使用docker的方法。

前提

  • 已安装Docker和docker-compose
  • 了解Docker的基本概念和基本用法

如果你还没有安装Docker和docker-compose,或者没有了解Docker和容器化的基本概念和基本用法,可以参考[“容器(1):容器相关知识简介——容器化、docker、docker-compose、Kubernetes / K8s等”](« relref “../docker/index.zh-cn.md”»),里面有较为详细的介绍。

docker最佳实践

使用docker-compose统一管理容器

  1. 创建一个目录,用于存放docker-compose.yml文件和相关文件,例如放在~/docker下。
  2. 每需要运行一个容器,都在这个目录下创建一个子目录,用于存放该容器的相关文件,例如~/docker/nginx
  3. 在子目录中创建docker-compose.yml文件,用于定义该容器的配置,例如~/docker/nginx/docker-compose.yml

我们可以定义一些创建docker-compose.yml文件的模板,这样每次创建新的容器时,只需要复制一下模板,修改一下配置即可。例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
version: '3'

services:
  service-name:
    container_name: container-name
    image: image-source/image-name:tag
    environment:
      - SOME_ENV_VAR=some_value
    ports:
      - "host_port:container_port"
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            capabilities: ["gpu"]
            count: all
    volumes:
      - /path/on/host:/path/in/container
    restart: always

这个模板定义了一个服务,服务名为service-name,容器名为container-name,使用image-source/image-name:tag镜像,设置了环境变量SOME_ENV_VAR,映射了端口host_port:container_port,设置了资源限制,挂载了卷,设置了容器重启策略。并且可以使用Nvidia的GPU。

使用docker-compose启动容器

在子目录中的docker-compose.yml文件定义好之后,我们可以使用docker-compose命令启动容器。在子目录中执行:

1
docker-compose up -d

如果是第一次启动容器,活着需要重新构建容器,可以使用:

1
docker-compose up -d --build

如果需要停止容器,可以使用:

1
docker-compose down

如果想要删除容器的数据卷,可以使用:

1
docker-compose down -v

使用portainer管理容器

Portainer是一个轻量级的容器管理工具,可以用来管理Docker容器、镜像、网络等。包括查看所有容器的运行状态、日志、资源使用情况等,也可以通过Web界面启动、停止、删除容器。

Portainer有付费的商业版(Portainer BE),也有免费的社区版(Portainer CE),我们这里使用免费的社区版就可以。

我们可以使用docker-compose启动Portainer,然后通过Web界面管理容器,具体步骤如下:

  1. ~/docker目录下创建一个子目录portainer,在portainer目录下创建docker-compose.yml文件,内容如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    version: '3'
    services:
    portainer:
        image: portainer/portainer-ce:latest
        ports:
        - "8001:8001"
        - "9443:9443"
        restart: always
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./portainer_data:/data
    

    注意,在我使用Portainer时,官方的最新镜像portainer/portainer-ce:latest版本号是2.19.4,但2.19版本的Portainer不能完全支持Docker 26及以上版本。而我使用的Docker版本是27.0.3,所以我使用了2.20.1版本的Portainer,即portainer/portainer-ce:2.20.1

  2. portainer目录下执行:

    1
    
    docker-compose up -d
    
  3. 打开浏览器,访问http://localhost:8001,输入用户名和密码(第一次登录需要设置用户名和密码),即可进入Portainer的管理界面。

    Portainer

    点击Local,即可查看所有的容器、镜像、网络等:

    Portainer Local

  4. 如果想要通过Portainer远程管理某个机器上的Docker,你可以根据之前的文章“从公网访问个人网站——Nginx反向代理配置”中介绍的方法,用Nginx设置一个反向代理,和你的域名绑定,然后通过域名访问Portainer。

comments powered by Disqus