前言
docker基础包含安装、启动、dockerfile、私有仓库建立,docker-compose基础,常用命令等
博客地址:芒果橙的个人博客 【http://mangocheng.com】
一、基础
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.vim /etc/docker/daemon.json {"registry-mirrors": ["https://cxuueihg.mirror.aliyuncs.com"]} # 2.systemctl daemon-reload # 3.systemctl restart docker
-
-
修改镜像默认存储位置:
-
3. 制作过程
-
使用maven打成jar包
-
制作Dockerfile文件
-
二者放在同一个目录,终端编译镜像
# 镜像名字:标签 zuul:v1 # .指定Dockerfile所在目录 sudo docker build -t zuul:v1 .
-
启动容器
# -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 提供的参数覆盖。
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
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
- 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.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. 例子
# 注意,不可用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)
- 启动该容器,在该容器基础上创建新的镜像
- 其他方式,未尝试
- https://neusncp.com/user/blog?id=572
五、常用命令
# 查看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,关闭防火墙
systemctl status firewalld systemctl stop firewalld.service systemctl disable firewalld.service
-
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker
-
设置容器内的编码
# 先安装相关命令 apt-get install locales # 设置编码 localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
-
# 基础镜像 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里才行,并且需要刷新环境
source /etc/profile java -version
-
解决使用 docker build 时 Sending build context to Docker daemon 数据过大的问题
- 制作镜像时,会将dockerfile同级目录下(指定的目录)的所有文件发送到docker daemon
- 使用 dockerfile 创建镜像时新建目录
- 参考资料
-
使用外部的配置文件:试过,貌似不行