Docker入门

197 阅读8分钟

Docker

介绍

Docker 是一个开源的应用容器引擎,基于Go语言 并遵从 Apache2.0 协议开源

Docker解决问题

  • 环境不一致,一致性
  • 独立环境,隔离性
  • 快速部署

安装

  • 下载关于Dokcer的依赖环境

    yum -y install yum-utils device-mapper-persistent-data lvm2
    
  • 设置下载镜像源

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  • 安装docker

    #我们在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存
    yum makecache fast
    
    yum -y install docker-ce
    
  • 启动docker -- 设置开机启动 -- 测试

    # 启动docker
    systemctl start docker
    # 设置开机启动
    systemctl enable docker
    # 测试
    docker run hello-world
    

Docker的中央仓库

  1. Docker官方仓库:镜像全,速度慢

  2. 国内的镜像网站:网易蜂巢、daocloud。。。

  3. 公司私服

    1. 添加配置
    # 需要在 /etc/docker/daemon.json 添加
    {
       "registry-mirrors": ["http://registry.docker-cn.com"],
       "insecure-registries": ["ip:port"]
    }
    
  4. 重启服务

    # 重新加载配置文件
    systemctl daemon-reload
    # 重启服务
    systemctl restart docker
    

镜像

# 拉取镜像到本地
docker pull 镜像名称[:tag]
# 拉取tomcat
docker pull daocloud.io/library/tomcat:8.5.15-jre8
# 查看本地镜像
docker images
# 删除本地镜像
docker rmi 镜像标识(IMAGE ID)

镜像导入导出

# 导出本地docker
docker save -o 保存路径 镜像标识

# 导入本地镜像
docker load -i 本地镜像地址

# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

容器

运行容器

docker run 镜像标识|镜像名称[:tag]
# 常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像标识|镜像名称[:tag]
# -d 代表后台运行容器
# -p 宿主机端口:容器端口 为了映射当前linux的端口和容器的端口
# --name 容器名称 指定容器名称

查看容器

docker ps [-qa]
# -a 查看全部容器,包括没有运行的容器
# -q 只查看容器的标识

查看容器日志

docker logs -f 容器id
# -f 可以滚动查看日志的最后几行

进入容器内部

docker exec -it 容器id bash

删除容器

删除容器前需要先关闭容器

# 停止指定容器
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)

启动容器

docker start 容器id

Docker的应用

1.准备工程war包

2.准备MySql容器

# 运行MySql容器
# -e MYSQL_PASSWORD=root 设置mysql root用户默认密码
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

3.准备Tomcat容器

# 运行Tomcat容器 之前已经下载tomcat
docker run -d -p 8081:8080 --name tomcat id标识
# 将war包复制到Tomcat容器里(复制到webapps下)
docker cp 文件名称 容器id:容器内部位置

数据卷 volume

Q: 什么是数据卷?

A: 数据卷可以将宿主机的一个目录映射到容器内部的一个目录

Q: 为什么要使用数据卷

A: 在容器内部维护困难,使用数据卷可以在宿主机中操作目录中的内容

创建数据卷

# 创建数据卷
docker volume create 数据卷名称
# 创建之后默认存放在 /var/lib/docker/volumes/数据卷名称/_data

# 查看数据卷的详细信息
docker volume inspect 数据卷名称

# 查看所有数据卷的详细信息
docker volume ls

# 删除数据卷
docker vloume rm 数据卷名称

应用数据卷

当你映射数据卷时,如果数据卷不存在。docker会自动创建

# 该方法会将容器内部自带的文件 存放到默认存放路径
docker run -v 数据卷名称:容器内部路径 镜像id

指定一个路径作为数据卷的存放位置(推荐使用)

# 该方法则不会讲容器内部自带文件拉出去 所以该路径是空的
docker run -v 路径:容器内部路径 镜像id

error: IPv4 forwarding is disabled. Networking will not work.

在宿主机上执行 echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf

重启network和docker服务 systemctl restart network systemctl restart docker

Docker volume 清理

docker volume prune删除所有未使用的卷

自定义镜像

  1. 创建一个Dockerfile文件,指定自定义镜像信息

    Dockerfile中常用的内容

    • from:指定当前自定义镜像依赖环境

    • maintainer:维护者信息

    • copy:将相对路径下的内容复制到自定义镜像中

    • workdir:声明镜像默认工作目录

    • run:构建镜像时执行的命令

    • add:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

    • cmd:需要执行的命令(在workdir下执行,可以写多个但只以最后一个为准),构建容器后调用,也就是在容器启动时才进行调用

    • entrypoint:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

    • label:用于为镜像添加元数据。使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

      LABEL version="1.0" description="这是一个Web服务器"
      
    • env:设置环境变量

      ENV myName John Doe
      ENV myDog Rex The Dog
      ENV myCat=fluffy
      

    from daocloud.io/library/tomcat:8.5.15-jre8
    # ssm.war 需要放在当前路劲下
    copy ssm.war /usr/local/tomcat/webapps
    # 暂时不用
    workdir 
    cmd 
    
  2. 将准备好的Dockerfile文件,使用Docker命令制作镜像

    docker build -t 镜像名称:[tag]  Dockerfile路径
    

Dockerfile定义多镜像tomcat+mysql自动导入数据库

mysql镜像启动时会执行/docker-entrypoint-initdb.d目录下的.sh、.sql、.sql.gz文件

注意:不是所有版本的mysql镜像都支持这样做

亲测5.7可以使用,5.7.4不可使用

如果不能自动导入库

可使用docker commit命令导出有数据的mysql容器 做镜像

Dockerfile

FROM daocloud.io/library/tomcat:8.5.15-jre8 as tfd-tomcat
COPY tfd.war /usr/local/tomcat/webapps

FROM mysql:5.7 as tfd-mysql
ENV MYSQL_ROOT_PASSWORD=root
ENV TZ=Asia/Shanghai

ENV sqlFile=tfd.sql
ENV sqlPath=/mysql
ENV shFile=setup.sh

RUN mkdir -p $sqlPath
COPY $sqlFile $sqlPath
COPY $shFile /docker-entrypoint-initdb.d
RUN chmod a+x /docker-entrypoint-initdb.d/$shFile

setup.sh

#!/bin/bash

set -e

mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF 

source /$sqlPath/$sqlFile;

EOF

构建镜像

docker build -t tfd-tomcat --target tfd-tomcat .
docker build -t tfd-mysql --target tfd-mysql .

运行

docker run -d -p 8080:8080 --name tfd-tomcat tfd-tomcat
docker run -d -p 3306:3306 --name tfd-mysql tfd-mysql

Docker-Compose

运行一个镜像,需要添加大量的参数

可以通过Docker-Compose编写这些参数

Docker-Compose可以帮助我们批量的管理容器

只需要通过 docker-compose.yml 文件去维护

下载Docker-Compose

  1. 去github官网搜索docker-compose 链接,这里使用 1.24.1版本
  2. 修改DockerCompose文件的名称(方便使用)
  3. 给DockerCompose文件添加可执行权限
  4. 配置环境变量 (方便使用)
  5. 测试
# 改名
mv docker-compose-Linux-x86-64 docker-compose
# 加权限 需要可执行权限
chmod 777 docker-compose

# 加环境变量
# 	移动到目录a
mv docker-compose 目录a
vi /etc/profile
# 	添加 export PATH=目录a:$PATH 或者 修改原有的环境
source /etc/profile

# 测试
# 在任意目录下 输入docker-compose

使用Docker-Compose管理容器

compose 撰写、组成、构成、编写

使用Docker-Compose管理MySQL和Tomcat容器

不同docker-compose版本的yml配置文件书写格式不一样

注意在docker-compose.yml文件中,不要使用制表符

version: '3.1'
services:
  # 服务名称
  mysql:
    # 代表docker启动,这个容器会一起启动
    restart: always
    # 指定镜像路径
    image: daocloud.io/library/mysql:5.7.4
    # 指定容器名称
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      # 指定Mysql的ROOT用户密码
      MYSQL_ROOT_PASSWORD: root
      # 指定时区
      TZ: Asia/Shanghai
    # 映射数据卷
    volumes:
      - /opt/docker/mysql_data:/var/lib/mysql
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker/tomcat_logs:/usr/local/tomcat/logs

使用docker-compose.yml管理自定义镜像

version: '3.1'
services:
  tfd-mysql:
    restart: always
    image: tfd-mysql:latest
    container_name: tfd-mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
    volumes:
      - /usr/docker/volumes/mysql_data:/var/lib/mysql
  tfd-tomcat:
    restart: always
    image: tfd-tomcat:latest
    container_name: tfd-tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /usr/docker/volumes/tomcat_logs:/usr/local/tomcat/logs

使用docker-compose命令管理容器

使用docker-compose命令时,默认会在当前目录下找docker-compos.yml文件

docker-compose常用命令

# 基于docker-compose.yml启动管理容器
# 参数: -d 后台启动
docker-compose up -d

# 关闭+删除容器
docker-compose down

# 开启/关闭/重启 已经存在的 由docker-compose 维护的容器
docker-compose start
docker-compose stop
docker-compose restart

# 查看由docker-compose管理的容器
docker-compose ps

# 查看日期
# 参数:-f 滚动监控
docker-compose logs -f

使用docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像同时启动当前镜像,并且由docker-compose去管理容器

docker-compose.yml

version: '3.1'
service:
  ssm:
    restart: always
    # 构建自定义镜像
    build:
      # 指定自定义镜像路径
      context: ../
      # 指定文件名称
      dockerfile: Dockerfile
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai

Dockerfile

from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps

自定义镜像须知

  • 如果自定义镜像不存在docker-compose up -d命令会自动构建
  • 如果自定义镜像已经存在则直接使用这个镜像
  • 如果需要重新构建该镜像,使用docker-compose build或者docker-compose up -d --build

Docker容器导出成镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数说明;

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停

example:docker commit -a "lx" -m "tfd-mysql" 9f tfd-mysql:1.0.1