docker及docker-compose基础:安装、启动、dockerfile制作、常用命令

前言

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命令。

    • dockerfile资料
  • 相关知识

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

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

2. 安装

  • Ubuntu18环境

    • 添加用户权限

    • 设置加速器

      # 1.vim /etc/docker/daemon.json
      {"registry-mirrors": ["https://cxuueihg.mirror.aliyuncs.com"]}
      # 2.systemctl daemon-reload
      # 3.systemctl restart docker
      
  • Centos7环境

    • 修改镜像默认存储位置:

      • 参考一
      • 参考二
    • requirements.txt依赖制作镜像

3. 制作过程

  1. 使用maven打成jar包

  2. 制作Dockerfile文件

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

    # 镜像名字:标签    zuul:v1
    # .指定Dockerfile所在目录
    sudo docker build -t zuul:v1 .
    
  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. 基础知识

  • 参考资料

  • 可以通过指定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

    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.下载:其中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
    
    
  • 容器中使用宿主机的shell命令

    -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
    
  • Dockerfile里执行shell脚本

    # 基础镜像
    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 创建镜像时新建目录
    • 参考资料
  • 使用外部的配置文件:试过,貌似不行

你可能感兴趣的:(开发工具,docker,容器,运维)