一、基础
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. 安装
-
- 添加用户权限
- 设置加速器
1
2
3
41.vim /etc/docker/daemon.json
{"registry-mirrors": ["https://cxuueihg.mirror.aliyuncs.com"]}
2.systemctl daemon-reload
3.systemctl restart docker
- 修改镜像默认存储位置:
- requirements.txt依赖制作镜像
3. 制作过程
使用maven打成jar包
制作Dockerfile文件
二者放在同一个目录,终端编译镜像
1
2
3镜像名字:标签 zuul:v1
.指定Dockerfile所在目录
sudo docker build -t zuul:v1 .启动容器
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
- 查找hub上的镜像:docker search tomcat
- 拉取镜像:docker pull tomcat
- 启动:docker run tomcat
二、制作Dockerfile
1. 基础知识
可以通过指定tag标识版本
2. 属性
ENTRYPOINT :配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
1
2
3
4
5
6
7ENTRYPOINT ["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
2CMD ["/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
- docker pull registry
- docker run -d -v /registry:/var/lib/registry -p 5000:5000 –restart=always –privileged=true –name registry registry:latest
- docker tag hello-world:latest 192.168.23.23:5000/hello-world:v1【得在本地(服务器)打标签】
- 源镜像名:标签
- 源镜像id localhost/项目名称/镜像名称:标签
- docker push localhost:5000/hello-world:v1
- localhost:5000/test/hello-world:v1
- test为该镜像的父级
- localhost:5000/test/hello-world:v1
- curl http://192.168.23.23:5000/v2/_catalog ===客户端操作
- curl localhost:5000/v2/hello-world/tags/list ===客户端:获取单个镜像的标签列表
- 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版本 3.4 17.09.0+ 3 1.13.0+ 2 1.10.0+ 1 1.9.1.+
2. 安装
1 | 1.下载:其中1.23.1为版本号,可根据需要修改 |
3. network
- 使用这个相当于自定义,会创建一个网路
- 使用的值必须在下方使用map结构创建
- host只能有一个,故不能再定义;bridge可以有多个
- 如果要使用host,需要用network_mode
4. 例子
1 | # 注意,不可用tab符号作空格 |
四、Conda环境-制作python环境镜像
- 迁移拷贝conda环境
- 找到conda安装目录里的envs文件夹
- 将里面的环境拷贝到docker容器相应的文件夹下(conda/miniconda3镜像的位置/usr/local/envs)
- 启动该容器,在该容器基础上创建新的镜像
- 其他方式,未尝试
五、常用命令
1 | 查看docker信息 |
六、注意事项
Dockerfile文件,里面的注释# 要单独一行,否则会被当做参数解析
SpringCloud微服务体系中,网络模式eureka使用bridge,其他的使用host
若后端报错NoRouteToHost,关闭防火墙
1
2
3systemctl status firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service-
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-
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
2source /etc/profile
java -version解决使用 docker build 时 Sending build context to Docker daemon 数据过大的问题
- 制作镜像时,会将dockerfile同级目录下(指定的目录)的所有文件发送到docker daemon
- 使用 dockerfile 创建镜像时新建目录
- 参考资料
- 使用外部的配置文件:试过,貌似不行