一、docker基础 安装docker 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 33 34 35 36 37 38 39 40 41 42 复制1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。 通过 uname -r 命令查看你当前的内核版本 $ uname -r 2、使用 root 权限登录 Centos。确保 yum 包更新到最新。 $ sudo yum update 3、卸载旧版本(如果安装过旧版本的话) $ sudo yum remove docker docker-common docker-selinux docker-engine 4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 5、设置yum源 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 6、可以查看所有仓库中所有docker版本,并选择特定版本安装 $ yum list docker-ce --showduplicates | sort -r 7、安装docker $ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0 $ sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce 8、启动并加入开机启动 $ sudo systemctl start docker $ sudo systemctl enable docker 9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了) $ docker version 二、问题 1、因为之前已经安装过旧版本的docker,在安装的时候报错如下: Transaction check error: file /usr/bin/docker from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64 file /usr/bin/docker-containerd from install of docker-ce-17.12.0.ce-1.el7.centos.x86_64 conflicts with file from package docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64 2、卸载旧版本的包 $ sudo yum erase docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64 3、再次安装docker $ sudo yum install docker-ce
修改镜像源 1 2 3 4 5 6 7 8 9 复制# 创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 # vi /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } # 启动docker # systemctl restart docker.service # 我的“专属阿里镜像源”:https://xxhoqnco.mirror.aliyuncs.com
二、Dockerfile构建镜像语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 复制1.FROM 基础镜像 2.MAINTAIN 作者信息 3.RUN 命令(该命令是运行在安装软件时,在基础镜像上面运行的命令) 4.CMD 命令(启动容器时运行的命令,如果文件最后添加了ENTRYPOINT 命令,则该命令会被覆盖) 5.USED 用户(设置容器操作用户) 6.EXPOSE 端口(容器向外暴露的端口) 7.ENV 环境变量(设置容器内环境变量) 8.ADD 文件(添加文件) 9.VOLUME 目录(挂在宿主机目录) 10.WORKDIR 目录(工作目录) dockerfile里面所设置的这些内容实际上基本上都可以在容器启动时设定,但是想要做成一个成熟的镜像还是有比要把这些基础设置填写完全.
3、docker-compose构建容器语法
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 复制build 指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。 build: /path/to/build/dir command 覆盖容器启动后默认执行的命令。 command: bundle exec thin -p 3000 links 链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。 links: – db – db:database – redis 使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如: 172.17.2.186 db 相应的环境变量也将被创建。 external_links 链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。 external_links: – redis_1 – project_db_1:mysql – project_db_1:postgresql ports 暴露端口信息。 使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。 ports: – “3000” – “8000:8000″ – “127.0.0.1:8001:8001″ 注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。 expose 暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数 expose: – “3000” – “8000” volumes 卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。 volumes: – /var/lib/mysql – cache/:/tmp/cache – ~/configs:/etc/configs/:ro volumes_from 从另一个服务或容器挂载它的所有卷。 volumes_from: – service_name – container_name environment 设置环境变量。你可以使用数组或字典两种格式。 只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。 environment: – RACK_ENV=development – SESSION_SECRET env_file 从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。 如果有变量名称与 environment 指令冲突,则以后者为准。 env_file: .env env_file: – ./common.env – ./apps/web.env – /opt/secrets.env 环境变量文件中每一行必须符合格式,支持 # 开头的注释行。 # common.env: Set Rails/Rack environment RACK_ENV=development extends 基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml。 # common.yml webapp: build: ./webapp environment: – DEBUG=false – SEND_EMAILS=false development.yml web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db environment: - DEBUG=true db: image: postgres 后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。 net 设置网络模式。使用和 docker client 的 --net 参数一样的值。 net: "bridge" net: "none" net: "container:[name or id]" net: "host" pid 跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。 pid: "host" dns 配置 DNS 服务器。可以是一个值,也可以是一个列表。 dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9 cap_add, cap_drop 添加或放弃容器的 Linux 能力(Capabiliity)。 cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN dns_search 配置 DNS 搜索域。可以是一个值,也可以是一个列表。 dns_search: example.com dns_search: - domain1.example.com - domain2.example.com working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares 这些都是和 docker run 支持的选项类似。 cpu_shares: 73 working_dir: /code entrypoint: /code/entrypoint.sh user: postgresql hostname: foo domainname: foo.com mem_limit: 1000000000 privileged: true restart: always stdin_open: true tty: true
三、实例 创建自己的镜像
1、创建目录
mkdir py cd py
2、编写 Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 复制 # Use an official Python runtime as a parent image FROM python:3.6 # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["scrayd"]
3、编写requirements.txt 1 2 3 4 5 6 7 8 9 10 11 12 复制scrapy==1.5.0 scrapyd==1.2.0 enum-compat==0.0.2 w3lib==1.19.0 redis==2.10.6 scrapy-redis==0.6.8 # 生成requirements.txt文件 # pip freeze > requirements.txt # 安装requirements.txt依赖 # pip install -r requirements.txt
PS:redis是python连接redis数据库的驱动库,并不是redis数据库本身
4、创建 镜像
docker build -t dtest .
PS: dtest 是自定义的镜像名
后面有个 . 号,不要忘记
这一步有时候网络连接有问题,显示timeout,换个时间重新执行就好
下载完成后,通过以下命令查看
docker image ls docker iamges
5、启动容器 1 2 3 复制# 启动指定镜像名,不指定tag,则默认是lastest docker run -it -p 6800:6800 镜像名 sh
6、拷贝文件 从主机复制到容器
1 2 3 4 5 6 复制 # 查看容器ID docker ps -a docker cp host_path containerID:container_path # 拷贝scrapyd的配置文件 , f0a485e9d01a容器对应的ID docker cp f:/default_scrapyd.conf f0a485e9d01a:/usr/localb/python3.6/site-packages/scrapyd/default_scrapyd.conf
修改的config文件:
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 复制[scrapyd] eggs_dir = eggs logs_dir = logs items_dir = jobs_to_keep = 5 dbs_dir = dbs max_proc = 0 max_proc_per_cpu = 4 finished_to_keep = 100 poll_interval = 5.0 bind_address = 0.0.0.0 http_port = 6800 debug = off runner = scrapyd.runner application = scrapyd.app.application launcher = scrapyd.launcher.Launcher webroot = scrapyd.website.Root [services] schedule.json = scrapyd.webservice.Schedule cancel.json = scrapyd.webservice.Cancel addversion.json = scrapyd.webservice.AddVersion listprojects.json = scrapyd.webservice.ListProjects listversions.json = scrapyd.webservice.ListVersions listspiders.json = scrapyd.webservice.ListSpiders delproject.json = scrapyd.webservice.DeleteProject delversion.json = scrapyd.webservice.DeleteVersion listjobs.json = scrapyd.webservice.ListJobs daemonstatus.json = scrapyd.webservice.DaemonStatus
从容器复制到主机
1 2 3 复制docker cp containerID:container_path host_path docker cp f0a485e9d01a:/usr/localb/python3.6/site-packages/scrapyd/default_scrapyd.conf d:/default_scrapyd.conf
7、 生成新的镜像
docker commit 容器id或容器名 新的镜像名:tag
8、启动容器 输入以下命令:
1 2 3 4 5 复制# 启动指定镜像名,不指定tag,则默认是lastest docker run -it -p 6800:6800 镜像名 sh # 启动指定镜像ID docker run -it 镜像id
可以进入安装好的镜像中,就像普通的linux一样
9、启动scrapyd
#在docker容器中 scrapyd
10、修改scrapy项目配置 1 2 3 4 5 6 7 复制# 修改scrapy项目的settings REDIS_URL = 'redis://192.168.99.1:6379' #修改scrapy项目的scrapy.conf [deploy:127] url = http://192.168.99.100:6800/addversion.json
11、修改redis的配置
bind 0.0.0.0
12、上传项目到scrapyd
python scrapyd-deploy 127 -p sr
四、 上传项目到阿里云 1、 阿里云注册账号 https://dev.aliyun.com/search.html
https://cr.console.aliyun.com/?accounttraceid=d7e0214a-b128-4f0a-b791-b6619f304aec#/imageList
2、 创建镜像仓库的命名空间 https://cr.console.aliyun.com/?spm=5176.8351553.aliyun_sidebar.12.12c01991EljTBW#/namespace/index
例如: mumutest
3、 创建镜像仓库 例如:mumu
创建好仓库后,记住仓库地址:
譬如:registry.cn-hangzhou.aliyuncs.com/dtest/mumu
4、 在docker登录阿里云
docker login –username=mumuloveshine1 registry.cn-hangzhou.aliyuncs.com
PS:mumuloveshine1 是你的登录用户名
5、 修改镜像的名称 1 2 3 4 5 6 7 8 9 复制# 查看所有镜像,找到需要上传的镜像id docker images # 186a34ea8e3d:镜像ID # mumutest: 命名空间 # mumu: 镜像仓库 # 这一步只是修改镜像的名称!!!!! docker tag 186a34ea8e3d registry.cn-hangzhou.aliyuncs.com/mumutest/mumu
6、 上传镜像到阿里云
docker push registry.cn-hangzhou.aliyuncs.com/dtest/mumu
7、 下载服务器的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/dtest/mumu