容器:docker——使用 dockerfile 构建镜像和使用 docker compose 管理镜像

文章目录

  • 一、使用 Dockerfile 构建镜像
    • 1.1 常用命令
    • 1.2 使用脚本创建镜像
  • 二、上传镜像到 Docker Hub
  • 三、搭建私有仓库
  • 四、docker compose 的安装和使用
    • 4.1 Ubuntu 安装 docker compose
    • 4.2 使用示例

一、使用 Dockerfile 构建镜像

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
  • 对于运维人员:在部署时,可以实现应用的无缝移植。

1.1 常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key=value 设置环境变量 (可以写多条)
RUN command 是 Dockerfile 的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和 ADD 相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
CMD [“executable”, “param1”, “param2”…] 容器启动时执行的操作

更多命令参考官方文档:传送门

1.2 使用脚本创建镜像

步骤:

  1. 创建目录:

    mkdir –p /usr/local/dockerdjango
    
  2. 创建文件Dockerfile:

    vim Dockerfile    # 名字必须为 Dockerfile 或 dockerfile
    
  3. 写入命令:

    # 依赖镜像名称和标签
    FROM python:3.6
    # 指定镜像创建者信息
    MAINTAINER hugh
    # 复制文件
    ADD ./requirement.txt /home/
    # 执行命令
    RUN pip install -r /home/requirement.txt -i 指定pip源
    RUN mkdir /usr/local/django_pro
    # 指定工作目录
    WORKDIR ~/project_pro
    CMD ["uwsgi","--ini","/home/django_pro/uwsgi.ini"]
    
  4. 执行命令构建镜像:

    docker build -t='镜像名称:标签' .    # 注意后边的空格和点
    
  5. 查看镜像是否建立完成:

    docker images
    

二、上传镜像到 Docker Hub

步骤如下:

  1. 登录到 Docker Hub,执行以下命令:

    docker login
    

    然后输入用户名和密码,没有账户的,就通过浏览器注册一个。

  2. 给镜像打上标签:

    必须规范镜像名称为”docker hub用户名/镜像名称“。

    docker tag 镜像名称或ID:标签 用户名/镜像名称:标签
    
  3. 推送到远程仓库:

    docker push 用户名/镜像名称:标签
    

三、搭建私有仓库

步骤如下:

  1. 拉取私有仓库镜像:

    docker pull registry
    
  2. 配置仓库地址:

    vim /etc/docker/daemon.json
    

    修改为自己的 ip 地址后保存退出:

    "insecure-registries": ["IP 地址:5000"]
    
  3. 重启 docker:

    systemctl restart docker
    
  4. 启动容器:

     docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
    

    Registry 服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

  5. 浏览器访问:http://ip 地址:5000/v2/_catalog

  6. 打标签,使其指向我们的注册表:

    docker tag 镜像名称或id ip地址:5000/myfirstimage
    
  7. 推送镜像:

    docker push ip地址:5000/myfirstimage
    

四、docker compose 的安装和使用

Docker Compose 是一个用来定义运行复杂应用的Docker工具。一个使用Docker 容器的应用,通常由多个容器组成。使用 Docker Compose 能更加方便地管理这些容器应用。

Docker Compose 通过一个配置文件来管理多个 Docker 容器,在配置文件中,所有的容器通过 service 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

4.1 Ubuntu 安装 docker compose

  • 安装:

    curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    
  • 验证安装:

    docker-compose -v
    

4.2 使用示例

通过 docker-compose 构建一个在 docker 中运行的基于 python flask 框架的web应用,同时使用 redis 数据库。

**注意:**确保你已经安装了 Docker Engine,但不需要安装 Python 或Redis,因为这两个都是由 Docker 镜像提供的。

步骤:

  1. 创建工程目录,结构如下:

    └── compose_test
        ├── docker
        │   └── docker-compose.yml
        ├── Dockerfile
        └── src
            ├── app.py
            └── requirements.txt
    
  2. 在compose_test/src/目录下创建 python flask 应用,文件名为 app.py:

    from flask import Flask
    from redis import Redis
     
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
     
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! I have been seen {} times.\n'.format(count)
     
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    
  3. 创建 python 依赖文件 compose_test/src/requirements.txt:

    flask
    redis
    
  4. 创建容器的 Dockerfile 文件:

    FROM python:3.9
     
    COPY src/ /opt/src
    WORKDIR /opt/src
     
    RUN pip install -r requirements.txt
    CMD ["python", "app.py"]
    
  5. 在compose_test/docker/目录下定义 docker-compose 脚本,文件名为 docker-compose.yml:

    version: '3'
    services:
      web:
        build: ../
        ports:
         - "5000:5000"
        volumes:
         - ../src:/opt/src
      redis:
        image: redis:3.0.7
    

    这个compose文件定义了两个服务,即定义了web和redis两个容器:

    • web 容器:
      • 使用当前 docker-compose.yml 文件所在目录的上级目录(compose_test/Dockerfile)中的 Dockerfile 构建映像。
      • 将容器上的5000端口映射到主机上的5000端口。
      • 将主机上的项目目录 compose_test/src 挂载到容器中的 /opt/src 目录。
    • redis 容器:
      • 使用从 Docker Hub 提取的官方 redis 镜像3.0.7版本。
  6. 使用 Compose 构建并运行应用程序:

    docker-compose up
    
    # 若不使用默认的 docker-compose.yml 文件名,则需要 -f 参数指定:
    # docker-compose -f 文件名.yml up -d 
    

    然后在浏览器中输入 http://0.0.0.0:5000/ 查看运行的应用程序。

  • 常用配置参数:

    • version:指定 Docker Compose 文件的版本号。
    • services:定义多个服务并配置启动参数。
    • volumes:声明或创建在多个服务中共同使用的数据卷对象。
    • networks:定义在多个服务中共同使用的网络对象。
    • configs:声明将在本服务中要使用的一些配置文件。
    • secrets:声明将在本服务中要使用的一些秘钥、密码文件。
    • x-***:自定义配置,主要用于复用相同的配置。
  • 常用命令:

    docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件
    docker-compose -f 指定文件 up
    docker-compose up -d  # 后台执行,一般我们看日志输出,不用这个
    
    docker-compose stop  # 停止,不会删除容器和镜像
    docker-compose down # 停止,并删除关联的容器
    docker-compose start  # 启动yml文件管理的容器
    docker-compose ps    # 正在运行的容器
    docker-compose images # docker-compose管理的容器
    
    docker-compose exec yml文件中写的service /bin/bash  # 进入到容器内
    

更多配置项参考官方文档:传送门

你可能感兴趣的:(容器,docker,容器,运维)