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

  • 相关知识

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

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

2. 安装

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. 基础知识

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.417.09.0+
    31.13.0+
    21.10.0+
    11.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-compose 搭建的lamp+redis 代码 附上docker-compose # 标准配置文件应该包含 version、services、networks 三大部分, # 其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则 # 指定版本号 version: '2' services: # 在 services 标签下的第二级标签是 console,这个名字是用户自己自定义,它就是服务名称。 console: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: console # 容器内置名称 hostname: console # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/console # dockerfile 指定 Dockerfile文件名称 dockerfile: Dockerfile # volumes_from 从其它容器或者服务挂载数据卷, # 可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - php # 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式 # ,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统 volumes: # 使用绝对路径挂载数据卷 - /root/.ssh/:/root/.ssh/ # 类似于使用 docker run 的效果 我也不知道 不写因为console并不是直接启动导致镜像不会产生 tty: true # web,这个名字是用户自己自定义,它就是服务名称。 web: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: web # 容器内置名称 hostname: web # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/nginx # dockerfile 指定 Dockerfile文件名称 dockerfile: Dockerfile # 映射端口 ports: - '80:80' # 此选项解决了启动顺序的问题 这个的意思是必须在php启动以后才能启动 # 注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时, # 也会启动 php 服务,因为在配置文件中定义了依赖关系 depends_on: - php # volumes_from 从其它容器或者服务挂载数据卷, volumes_from: - php volumes: # 已经存在的命名的数据卷 - nginx-log:/var/log/nginx # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器 - ./images/nginx/sites-enabled:/etc/nginx/sites-enabled - ./images/nginx/cert:/etc/nginx/cert # 加入指定网络 networks: default: # 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器 aliases: - web.sunchanghao.top - mid.sunchanghao.top - sevice.sunchanghao.top - admin.sunchanghao.top # php,这个名字是用户自己自定义,它就是服务名称。 php: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: php # 容器内置名称 hostname: php # 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile, # 在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile # 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 build: # context 选项可以是 Dockerfile文件路径,也可以是到链接到 git 仓库的 url # 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context context: ./images/php # 使用此 dockerfile 文件来构建,必须指定构建路径 dockerfile: Dockerfile # 挂载一个目录或者一个已存在的数据卷容器, volumes: # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./app:/mnt/app # db,这个名字是用户自己自定义,它就是服务名称。 db: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: db # 容器内置名称 hostname: db # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID image: mysql:5.7 environment: MYSQL_USER: 'sch' MYSQL_PASS: '1111' MYSQL_ROOT_PASSWORD: 'root' volumes: - db:/var/lib/mysql ports: - '3306:3306' redis: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: redis # 容器内置名称 hostname: redis # image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 image: redis:3.2.7 # 设置端口号 ports: - '6379:6379' # 挂载一个目录或者一个已存在的数据卷容器 volumes: # 已经存在的命名的数据卷。 - redis:/data # node volumes: nginx-log: # 设置volume的驱动,默认是local. driver: local db: driver: local redis: driver: local
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒果-橙

谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值