Docker的打包与部署

Docker的打包与部署

本次测试均使用阿里云的试用产品 https://free.aliyun.com/?crowd=personal

linux下docker的安装 #

  • 安装命令
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  • 查看信息
[root@iZ2zefgusws66mismamte8Z ~]# docker version
Client: Docker Engine - Community    
 Version:           24.0.5     
 API version:       1.43      
 Go version:        go1.20.6   
 Git commit:        ced0996     
 Built:             Fri Jul 21 20:39:02 2023     
 OS/Arch:           linux/amd64       
 Context:           default 
Server: Docker Engine - Community     
 Engine:                         
  Version:          24.0.5    
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.6   
  Git commit:       a61e2b4  
  Built:            Fri Jul 21 20:38:05 2023  
  OS/Arch:          linux/amd64    
  Experimental:     false   
 containerd:                
  Version:          1.6.22     
  GitCommit:        8165feabfdfe38c65b599c4993d227328c231fca
 runc:                       
  Version:          1.1.8       
  GitCommit:        v1.1.8-0-g82f18fe      
 docker-init:        
  Version:          0.19.0      
  GitCommit:        de40ad0
  • 启动docker
systemctl start docker

创建容器 #

  • 创建一个php7.4+nginx1.20的容器,启动80端口,访问101.201.45.61输出hellow world
  1. 下载镜像
docker pull nginx:1.20
docker pull php:7.4-fpm
[root@iZ2zefgusws66mismamte8Z ~]# docker images     
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE      
php          7.4-fpm   38f2b691dcb8   9 months ago    443MB 
nginx        1.20      0584b370e957   15 months ago   141MB
  1. 创建容器
# 创建一个php容器,宿主机目录/data/www为代码目录
docker run --name php74 -v /data/www:/www -v /usr/local/php74/conf/:/usr/local/etc/php/ -d php:7.4-fpm

# 创建一个nginx容器并连接到php的容器,不推荐用link,推荐用network
docker run --name nginx120 -p 80:80 -d -v /data/www:/usr/share/nginx/html -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/usr/share/nginx/logs --link php74:php nginx:1.20
  1. nginx的配置文件参考
server {           
    listen       80;  
    server_name  101.201.45.61; 
    root   /usr/share/nginx/html;   
    index  index.html index.htm index.php;
    access_log  /usr/share/nginx/logs/access.log  main;         
    error_log   /usr/share/nginx/logs/error.log error;    
    error_page   500 502 503 504  /50x.html;
    location ~ \.php$ {     
    # 此处的php即为创建nginx容器时连接的php容器的名字
        fastcgi_pass   php:9000;   
        fastcgi_index  index.php;  
	    #此处的路径得是php容器的代码根目录
        fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
        include        fastcgi_params; 
    }      
}
  1. 如果是阿里云的测试服务器,需要在安全组添加入方向的80端口规则

容器打包及部署 #

方式一:将容器打包并上传至镜像仓库,然后在需要的服务器使用docker pull命令下载 方式二:将容器打包成一个tar包,然后将tar包上传至需要的服务器,然后docker load命令加载

创建一个仓库 #

参考:https://help.aliyun.com/document_detail/612664.html?pipCode=acr&goodsId=936788

  1. 在阿里云上创建一个仓库https://cr.console.aliyun.com/cn-beijing/instances,创建一个个人仓库,创建了一个nginx的仓库,namespacec_space
  2. 然后在服务器上登录到仓库
docker login --username=aliyunaccount registry.cn-beijing.aliyuncs.com
  1. 测试将之前下载的nginx镜像上传到阿里的仓库中
# docker tag [ImageId] registry.cn-beijing.aliyuncs.com/c_space/nginx:[镜像版本号]
docker tag nginx:1.20 registry.cn-beijing.aliyuncs.com/c_space/nginx:1.20

# docker push registry.cn-beijing.aliyuncs.com/c_space/nginx:[镜像版本号]
docker push registry.cn-beijing.aliyuncs.com/c_space/nginx:1.20
  1. 以上将一个下载的公共镜像上传到了阿里的仓库中,下次使用可以直接从阿里的仓库中下载
# docker pull registry.cn-beijing.aliyuncs.com/c_space/nginx:[镜像版本号]
docker pull registry.cn-beijing.aliyuncs.com/c_space/nginx:1.20

将容器打包成为镜像 #

  1. 容器打包成镜像上传到仓库
# 命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# options选项:-a :提交的镜像作者;
# -c :使用Dockerfile指令来创建镜像;
# -m :提交时的说明文字;
# -p :在commit时,将容器暂停。

docker commit nginx120 registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200

docker push registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200
  1. 容器打包并打包成文件
# 命令:docker save -o 将要保存到本地的文件名 要保存的镜像
docker save -o /data/www/nginx-1200.tar registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200
# 然后在/data/www目录下就可以看到一个nginx-1200.tar

在另外的服务器下载并运行 #

  1. 从仓库下载之前打包的镜像并运行
docker pull registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200

docker run --name nginx1200 -p 80:80 -d -v /data/www:/usr/share/nginx/html -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/usr/share/nginx/logs --link php74:php registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200
  1. 将导出镜像文件导入并运行
# 方法一、docker load < [image.tar_name]  
# 方法二、 docker load --input [image.tar_name]  
# 注意: docker load 不能指定镜像的名称
docker load --input /data/www/nginx-1200.tar

docker run --name nginx1200 -p 80:80 -d -v /data/www:/usr/share/nginx/html -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/usr/share/nginx/logs --link php74:php registry.cn-beijing.aliyuncs.com/c_space/nginx:1.200

使用docker-compose将多个容器一起打包 #

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用Dockerfile我们很容易定义一个单独的应用容器。然而在日常开发工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器;再比如在分布式应用一般包含若干个服务,每个服务一般都会部署多个实例。如果每个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就需要一个工具能够管理一组相关联的的应用容器,这就是Docker Compose。

docker-compose安装 #

# 安装命令,直接将二进制文件下载下来即可直接使用
curl -SL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

chmod +x /usr/bin/docker-compose

docker-compose --version
# Docker Compose version v2.21.0

创建docker-compose.yml后进入到yml所在目录执行 docker-compose up -d

docker-compose.yml参考 #

注意:links不再推荐使用,可以用networks替代,两个容器需要指定相同的networks

version: '3' #docker-compose语法的版本
services:
  nginx: #创建 nginx容器
    image: registry.cn-beijing.aliyuncs.com/c_space/nginx:1.20 #用的之前创建的额阿里镜像仓库
    ports:  #映射 80端口到本机
      - 80:80
    volumes: 
      - /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d  #把容器的nginx.conf映射到 ./nginx/nginx.conf,
      - /data/www:/usr/share/nginx/html #把容器的/var/www 映射到./src
    networks:
	  - php-nginx-net
  php74: #创建 php的容器
    # image: registry.cn-beijing.aliyuncs.com/c_space/php:7.400
    build: ./dockerfile/
    volumes:
      - /data/www:/www #www目录映射
      - /usr/local/php74/conf/:/usr/local/etc/php/ #把容器的 php.ini映射到 ./php/php.ini
    networks: #此处创建
	  php-nginx-net:
	    aliases:
	      - php

networks:
  php-nginx-net:

dockerfile #

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。