docker及docker-compose基础

一、基础

参考资料

1. 概念

一个平台,开发者通过容器可用于构建、运行和共享应用。使用容器部署应用统称为容器化。

  • docker daemon:守护进程,运行在宿主机上

  • docker client:命令行工具,与docker daemon交互

  • docker image:镜像,包含需要运行的文件;用来创建container,一个镜像可以运行多个container;镜像通过dockerfile创建,也可以从docker hub/registry上下载

  • docker container:容器,docker的运行组件,启动一个镜像就是一个容器;容器是一个隔离环境,多个容器之间不会相互影响

  • docker hub/registry:共享和管理docker镜像,用户可以上传或下载上面的镜像;可以搭建自己私有的docker registry

  • dockerfile:一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。

  • 相关知识

    • 挂载:将容器里的目录与宿主机进行映射;把容器中某目录的数据加载到宿主机的目录
      • -v参数后面接的冒号前面的是宿主机的目录,冒号后面的是容器的挂载目录,程序启动命令是加载容器中的目录,而不是宿主机的目录
  • 优势

    • 灵活
    • 轻量
    • 可移植性
    • 低耦合
    • 可扩展
    • 安全

2. 安装

3. 制作过程

  1. 使用maven打成jar包

  2. 制作Dockerfile文件

  3. 二者放在同一个目录,终端编译镜像

    1
    2
    3
    # 镜像名字:标签    zuul:v1
    # .指定Dockerfile所在目录
    sudo docker build -t zuul:v1 .
  4. 启动容器

    1
    2
    3
    4
    # -p标识端口映射: 宿主机端口:容器端口
    sudo docker run --name zuul -d -p 9020:9020 zuul:v1
    # -v挂载目录:宿主机目录:容器目录 ;-d 后台运行;-it 交互方式运行(进入容器中)
    sudo docker run -dit --name 容器别名 -p 9000:9000 -v /home/dataexa/:/home/dataexa 镜像名字:标签

4. 使用示例

  • 安装tomcat
    1. 查找hub上的镜像:docker search tomcat
    2. 拉取镜像:docker pull tomcat
    3. 启动:docker run tomcat

二、制作Dockerfile

1. 基础知识

2. 属性

  • ENTRYPOINT :配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

    1
    2
    3
    4
    5
    6
    7
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Xmx1024m","-Xms1024m","/swapping.jar"]
    # -Djava.security.egd=file:/dev/./urandom
    # 添加java.security.egd的系统属性指向/dev/urandom,JVM上的随机数与熵池策略
    # -D 是新增参数,参数的名字叫 java.security.egd ,参数的值叫 file:/dev/./urandom,是为了解决随机数生成的问题
    # 使用不同的配置文件
    # "-Dspring.profiles.active=test"
    # "--Dspring.config.location=application.yml"
  • CMD:使用一些特殊的命令,如source

    1
    2
    CMD ["/bin/sh" "-c" "sleep 5; source /data/projects/python/venv/bin/activate && python ./fate_flow/fate_flow_server.py"]
    CMD ["/bin/bash", "-c", "source activate python3.5 && python tornado_service.py"]

3. 搭建本地私有仓库

  • 参考资料

  • 步骤

    服务器:192.168.23.23

    1. docker pull registry
    2. docker run -d -v /registry:/var/lib/registry -p 5000:5000 –restart=always –privileged=true –name registry registry:latest
    3. docker tag hello-world:latest 192.168.23.23:5000/hello-world:v1【得在本地(服务器)打标签】
      • 源镜像名:标签
      • 源镜像id localhost/项目名称/镜像名称:标签
    4. docker push localhost:5000/hello-world:v1
      • localhost:5000/test/hello-world:v1
        • test为该镜像的父级
    5. curl http://192.168.23.23:5000/v2/_catalog ===客户端操作
    6. curl localhost:5000/v2/hello-world/tags/list ===客户端:获取单个镜像的标签列表
    7. docker pull 192.168.23.23:5000/python3.5-conda:v2 ===客户端

三、docker-compose

1. 基础

docker容器工具,通过yml文件定义多docker容器应用,方便快速启动、停止多个容器。

限于单台宿主机,如果跨主机管理容器,可用Docker Smarm或流行K8S

  • 概念

    • 服务:一个应用的容器
    • 项目:由一组关联的应用容器组成的一个完整业务单元
  • 属性包含version、services、networks三大部分

  • Compose和Docker兼容性

    compose文件格式版本 docker版本
    3.4 17.09.0+
    3 1.13.0+
    2 1.10.0+
    1 1.9.1.+

2. 安装

1
2
3
4
5
6
7
8
# 1.下载:其中1.23.1为版本号,可根据需要修改
sudo curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 2.设置可执行
sudo chmod +x /usr/local/bin/docker-compose

# 3.查看版本
docker-compose -v

3. network

  • 使用这个相当于自定义,会创建一个网路
  • 使用的值必须在下方使用map结构创建
  • host只能有一个,故不能再定义;bridge可以有多个
  • 如果要使用host,需要用network_mode

4. 例子

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
# 注意,不可用tab符号作空格
# 版本号
version: "3.1"
# 服务
services:
# 服务名
eureka:
# 镜像名
image: eureka:1.0
# 容器名
container_name: eureka-v1
# 端口
ports:
- "8761:8761"
# 网络模式
network_mode: "bridge"

config:
image: config:1.0
container_name: config-v1
network_mode: "host"
# 依赖的服务
depends_on:
- eureka

zuul:
image: zuul:1.0
container_name: zuul-v1
depends_on:
- eureka
- config

# 自定义网络
networks:
# 默认
default:
driver: bridge
# bridge_net:
# driver: bridge
# host不可再定义,只能有一个

四、Conda环境-制作python环境镜像

  • 迁移拷贝conda环境
    • 找到conda安装目录里的envs文件夹
    • 将里面的环境拷贝到docker容器相应的文件夹下(conda/miniconda3镜像的位置/usr/local/envs)
    • 启动该容器,在该容器基础上创建新的镜像
  • 其他方式,未尝试

五、常用命令

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
# 查看docker信息
docker info

# 重启docker
service restart docker

# 查找镜像
docker search xxx

# 拉取镜像到本地
docker pull xx

#查看镜像
docker images

#删除镜像
docker rmi image_id

# 根据容器创建新镜像
docker commit 容器名 新镜像名:版本号
# 重命名容器
docker rename 原容器名 新容器名

#给镜像打标签
docker tag image_name image_name:tagName
docker tag hello-world hello_world:v1

# 导出镜像
docker save -o nginx.tar nginx:lates

# 导入镜像
docker load -i nginx.tar

# 查看启动的容器
docker ps

# 从宿主机拷贝到容器里
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

# 删除容器
docker rm container_id|container_name

# 关闭所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

# 查看容器挂载的目录
docker inspect container_name | grep Mounts -A 20

# 查看docker占用空间
docker system df

# 查看docker容器-正在运行
docker exec -it [eureka容器id] bash


# ==============docker-compose命令===============

# 启动
docker-compose up -d

# 启动一个其他名称的docker-compose文件
docker-compose -f docker-compose-dev.yml up -d

# 停止/启动一个服务
docker-compose stop|start service_name

# 更新镜像及容器
docker-compose up -d --build

# 验证docker-compose文件是否正确,若正确则不输出
sudo docker-compose config -q

# 查看网络
docker network ls

# 删除网路
docker network rm id

# 激活某个环境conda
source activate snowflakes

# 其他:https://www.cnblogs.com/lirunzhou/p/10601247.html

六、注意事项

  • Dockerfile文件,里面的注释# 要单独一行,否则会被当做参数解析

  • SpringCloud微服务体系中,网络模式eureka使用bridge,其他的使用host

  • 若后端报错NoRouteToHost,关闭防火墙

    1
    2
    3
    systemctl status firewalld
    systemctl stop firewalld.service
    systemctl disable firewalld.service
  • 容器中使用宿主机的shell命令

    1
    2
    -v /var/run/docker.sock:/var/run/docker.sock 
    -v /usr/bin/docker:/usr/bin/docker
  • 设置容器内的编码

    1
    2
    3
    4
    # 先安装相关命令
    apt-get install locales
    # 设置编码
    localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
  • Dockerfile里执行shell脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 基础镜像
    FROM java8-python3.5-conda:1.0.0
    # 拷贝项目文件,执行文件
    COPY project /code/project
    COPY start.sh /code
    # 设置工作目录
    WORKDIR /code
    # 处理脚本
    RUN chmod +x start.sh && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 执行脚本
    CMD ["sh","start.sh"]
  • 使用Java命令,需要配置在/etc/profile里才行,并且需要刷新环境

    1
    2
    source /etc/profile
    java -version
  • 解决使用 docker build 时 Sending build context to Docker daemon 数据过大的问题

    • 制作镜像时,会将dockerfile同级目录下(指定的目录)的所有文件发送到docker daemon
    • 使用 dockerfile 创建镜像时新建目录
    • 参考资料
------ 本文结束感谢您的阅读 ------

本文标题:docker及docker-compose基础

文章作者:MangoCheng

发布时间:2020年09月06日 - 20:32:08

最后更新:2022年08月17日 - 21:39:28

原始链接:http://mangocheng.com/posts/cfb15ce6.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。