Docker介绍

什么是Docker

  • 是一个开源的应用容器引擎,使用 Go 语言编写
  • 开箱即用,快速部署,可移植性强,环境隔离

为什么使用Docker

  • 提供一次性的环境,例如需要安装Mysql,则需要安装很多依赖库、版本等,如果使用Docker则通过镜像就可以直接启动运行;
  • 快速动态扩容,使用Docker部署了一个应用,可以制作成镜像,然后通Docker快速启动;
  • 组建微服务架构,可以在一个机器上模拟出多个微服务,启动多个应用;
  • 更好的资源隔离和共享

Docker的三个概念

  • image:就相当于是一个root文件系统
  • container:镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,容器和容器之间的操作互不影响,处于隔离的环境
  • repository:可看着一个代码控制中心,用来保存镜像,参考maven仓库

安装部署

关闭防火墙和selinux

  • 要想外界能够访问,需要关闭防火墙和selinux
  • 关闭防火墙命令
1
2
3
4
5
systemctl stop firewalld.service

# 只开放部分端口
# --permanent永久生效,没有此参数重启后就失效
firewall-cmd --permanent --add-port=80/tcp
  • 关闭selinux
1
2
3
4
5
6
7
8
# 查看当前selinux状态(Enforcing为开启,Permissive为关闭)
getenforce

# 临时关闭
setenforce 0

# 永久关闭 vi /etc/sysconfig/selinux 设置如下:
SELINUX=enforcing 替换为SELINUX=disabled

安装Docker

1
yum -y install docker
  • 安装社区版Docker(docker-ce)
    • 下载docker-ce的yum源
1
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装docker-ce
1
yum -y install docker-ce
  • 检查docker是否安装成功,docker version

Docker基本命令

  • Docker环境信息
1
2
3
4
5
6
7
8
# 查看docker命令
docker --help

# docker 详细信息,镜像和容器
docker info

# 查看docker版本
docker version
  • 管理Docker守护进程
1
2
3
4
5
systemctl start docker     #运行Docker守护进程
systemctl stop docker #停止Docker守护进程
systemctl restart docker #重启Docker守护进程
systemctl enable docker #设置Docker开机自启动
systemctl status docker #查看Docker的运行状态
  • 管理镜像
1
2
3
4
5
6
7
8
9
10
11
# 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5

# 修改标签
docker tag registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5 aliweb:v1

# 查看已有的镜像
docker images

# 强制删除镜像
docker rmi -f registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
  • 管理容器
1
2
3
4
5
6
7
8
9
10
11
# 启动一个新容器
docker run -it <镜像ID> /bin/bash

# 启动一个新容器,并指定名称,在后台运行
docker run -d --name <容器名> <镜像ID>

# 查看容器
docker ps

# 将容器做成镜像
docker commit <容器ID或容器名> <仓库名>:<标签>
  • Docker常用命令概览
1
2
3
4
5
6
7
8
9
10
11
Docker环境信息   info、version
镜像仓库命令 login、logout、pull、push、search
镜像管理 build、images、import、load、rmi、save、tag、commit
容器生命周期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理 volume、network
系统信息日志 events、history、logs

1.events打印容器的实时系统事件
2.history 打印出指定镜像的历史版本信息
3.logs打印容器中进程的运行日志

配置镜像加速

26年最新国内镜像源

1
sudo mkdir -p /etc/docker
1
2
3
4
5
6
7
8
9
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.hlmirror.com"
]
}
EOF
  • 强制重启docker
1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

添加阿里云镜像加速

阿里云容器镜像服务

镜像加速器配置

  • /etc/docker 目录下创建 daemon.json 文件
1
touch daemon.json
  • vi /etc/docker/daemon.json,在文件中插入如下内容

daemon.json配置

  • 然后执行如下命令即可
1
systemctl daemon-reload && systemctl restart docker

Docker镜像

搜索镜像

1
docker search <镜像名称>
  • 举例
1
2
3
4
5
# 搜索镜像并过滤是官方的
docker search --filter "is-official=true" centos

# 搜索镜像并过滤大于多少颗星星的
docker search --filter stars=10 centos

查看已拉取的镜像

  • 查看已拉取的镜像
1
docker images
  • 查看镜像的详细信息
1
docker inspect <镜像名称>/<镜像ID>

拉取镜像

  • 拉取镜像
1
docker pull <镜像名称>
  • 举例
1
2
# 拉取来自阿里云仓库的Apache镜像
docker pull registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5

删除镜像

  • 删除镜像
1
2
3
docker rmi -f <镜像名称>

docker rmi -f <镜像名称>:<标签>
1
2
# 删除阿里云仓库的Apache镜像
docker rmi -f registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5

修改镜像名称与标签

  • 旧的镜像会保留,并生成一个新的镜像
    • 新镜像的 IMAGE ID 与旧镜像的 IMAGE ID 相同
    • 如果要删除新镜像时,需要使用 docker rmi -f <镜像名称>:<标签>
1
2
3
4
5
6
7
8
# 第一种方式
docker tag <旧镜像名称> <新镜像名称>

# 第二种方式
docker tag <旧镜像名称>:<旧标签> <新镜像名称>:<新标签>

# 第三种方式
docker tag <镜像ID> <新镜像名称>:<新标签>
  • 举例
1
2
# 阿里云仓库的Apache镜像
docker tag registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest aliweb:v1

Docker容器

创建容器

1
2
3
4
5
6
7
# 创建容器并进入到容器中
docker run -it <镜像ID> /bin/bash
#或者
docker run -it <镜像名称>:<TAG> /bin/bash

# 创建容器并后台执行
docker run -d <镜像ID> /bin/bash
  • 参数说明

    • -i 表示以交互模式运行容器(让容器的标准输入保持打开)
    • -d 表示后台运行容器,并返回容器ID
    • -t 为容器重新分配一个伪输入终端
    • -p 指定映射端口
    • --name 为容器指定名称
    • --hostname 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中
  • 示例

1
2
# 将宿舍机的8080端口映射容器中的80端口
docker run -itd -p 8080:80 --name=nginx-v1 --hostname=jye nginx:latest /bin/bash

查看容器

1
2
3
4
5
6
7
8
# 查看已启动的容器
docker ps

# 查看所有容器ID(包括未启用的)
docker ps -a

# 查看容器信息
docker inspect <容器名称>

容器列表

容器详情

进入和退出容器

进入容器

1
docker exec -it <容器名称> /bin/bash
  • 注意事项:只能进入在运行中的容器,否则会报异常

进入容器异常

退出容器

  • 使用 exit 命令退出当前容器,但容器会停止
1
exit

启动和停止容器

1
2
3
4
5
# 启动容器
docker start <容器名称>

# 停止容器
docker stop <容器名称>

查看容器日志

1
2
3
4
docker logs -f <容器名称>

# 查看rabbitmq日志
docker logs -f rabbitmq

容器日志

删除容器

1
docker rm <容器名称>
  • 注意事项:在删除之前需要将容器停止

容器与宿主机之间的复制与挂载

容器与宿主机之间复制

  • 从宿主机复制到容器。docker cp <宿主机路径> <容器名称>/<容器ID>:<容器路径>
1
docker cp /data/demo/test.txt centos-demo:/home/
  • 从容器中复制到宿主机。docker cp <容器名称>/<容器ID>:<容器路径> <宿主机路径>
1
docker cp centos-demo:/home/hello.txt /root/

容器与宿主机之间的挂载

  • 宿主机文件夹挂载到容器中(已创建的容器无法再挂载)。就是让容器内部目录和宿主主机目录关联起来,这样的好处是:
    • 能够通过宿主机直接操作容器内部目录;
    • 可以将容器中重要数据放在挂载目录上,这样就算容器宕掉或者出现什么问题,重要数据不会丢失。
1
2
3
4
docker run -itd -v <宿主机目录>:<容器目录> <镜像ID> /bin/bash

# 示例
docker run -itd -v /data/demo/:/home --name centos7 5d0da3dc9764 /bin/bash
  • 注意点
    • 如果挂载的宿主机目录不存在,Docker 会自动创建这些目录。如果容器内的目录不存在,Docker 会自动创建这些目录
    • 没有挂在出来的任何内容都视为可删除缓存,所以必要持久化的数据都要创建数据卷
    • 如果要挂载更多的目录,只需在命令中添加更多的 -v 参数即可
1
docker run -d -v /path/on/host1:/path/in/container1 -v /path/on/host2:/path/in/container2 -v /path/on/host3:/path/in/container3 your_image_name