学习资料

菜鸟教程

bilibili狂神-Docker

安装Docker

win10/Linux安装docker

菜鸟教程Docker安装

linux中启动关闭docker

# 启动
systemctl start docker

# 守护进程重启
systemctl daemon-reload

# 重启docker服务
systemctl restart docker 
# 或 
service docker restart

# 关闭
docker service docker stop
# 或 
docker systemctl stop docker

配置镜像加速

国内源:
https://ung2thfc.mirror.aliyuncs.com
https://registry.docker-cn.com

  • windows打开设置,就可以添加。
  • Linux的Ubuntu16.04+、Debian8+、CentOS7配置镜像加速
    参考
    对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","https://ung2thfc.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://reg-mirror.qiniu.com","https://mirror.baidubce.com","https://registry.docker-cn.com"]}

之后重新启动服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker图解

image

开始使用Docker,基本命令

三个基本概念

  • 镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
  • 容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository): 仓库可看着一个代码控制中心,用来保存镜像

Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类

Docker 面向对象
镜像
容器 对象

也可简单理解为:

镜像是个软件安装包,容器是运行安装包后的装上的软件实体。
可以用这个安装包安装多次,创建多个应用,它们不会冲突。
如果安装后想删掉安装包,这在docker中是不允许的,会报错有使用中的容器,将该镜像创建的容器删掉后才能删该镜像。

常用命令

帮助命令

docker version      # 显示docker版本信息
docker info         # 显示docker的系统信息,包括镜像和容器数量
# docker command --help 深入的了解指定的 Docker 命令使用方法, 例如我们要查看 docker stats 指令的具体使用方法:
docker stats --help

镜像(Image)相关

查找/搜索镜像(从 Docker Hub中)

docker search mysql     # 搜索mysql镜像

系统中已存在的镜像(images)

docker images
docker images -a
# 参数
-a  # 列出所有镜像
-q  # 只列出id

# 同一仓库源可以有多个 TAG(镜像标签),代表这个仓库源的不同个版本

下载(拉取)镜像(images)

docker pull mysql	# 下载 mysql 镜像

删除镜像(images)

docker rmi 镜像ID
docker rmi 镜像ID 镜像ID 镜像ID    # 删除多个镜像
docker rmi -f $(docker images -aq)    # 删除全部镜像

更新 / 提交 自己的镜像

# 假设现在 nginx 容器里面没有 vim命令;
# 我们执行安装
apt-get install vim 
# 安装好后,希望以后创建镜像都能有。
# 这时我们就需要将这个容器制作成镜像,供以后使用。

# 语法:
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 例:
docker commit -m="add vim" -a="mrhjx" a123 my_nginx:1.0

构建镜像

使用命令 docker build,从零开始来创建一个新的镜像。

为此,需要创建一个 Dockerfile 文件, 其中包含一组指令来告诉 Docker 如何构建我们的镜像。

docker build -t mrhjx/centos:6.7 .

# 参数说明
-t: 指定要创建的目标镜像名
.: Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

给镜像添加标签

docker tag

# 例:为ID为860c279d2fec的镜像添加多一个标签 标签名为dev
docker tag 860c279d2fec mrhjx/centos:dev

容器(Container)相关

新建容器并启动

docker run [可选参数] image
# 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,
# 默认是从 Docker Hub 公共镜像源(https://hub.docker.com)下载。

# 参数说明
--name= Name    # 容器名字 tomcat01 tomcat02,用来区分容器
-d              # 后台方式运行
-it             # 使用交互方式运行,进入容器查看内容
-p              # 指定容器的端口-p8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-P              # 随机指定端口

# 例
docker run 镜像标识
# 启动一个容器,并以 交互方式运行 进入该容器▲▲▲
docker run -it ubuntu /bin/bash     # 使用 ubuntu 镜像启动一个容器,并以 交互方式运行 进入该容器
# 退出方法
exit        # 容器停止并退出
ctrl + P + Q    # (快捷键)容器不停止退出

「注意」如果启动的容器没有任何任务运行,该容器启动会立马退出。
这种情况如果希望将容器挂在后台运行,可以如下运行

docker run -d centos /bin/sh -c "while true;do sleep 1;done"

容器列表

docker ps
docker ps -a # 列出包括未运行的

启动、重启、停止容器

docker start 容器id     # 启动容器
docker restart 容器id   # 重启容器
docker stop 容器id      # 停止正在运行的容器
docker kill 容器id      # 强制停止容器

删除容器

docker rm 容器id	            # 删除容器时,容器必须是停止状态,否则会报错
docker rm $(docker ps -aq)      # 删除所有容器
docker ps -a -q|xargs docker rm  # 删除所有容器
docker container prune          # 清理掉所有处于停止状态的容器

进入正在运行的容器▲▲▲

docker exec -it [容器id] /bin/bash
exit    # 退出

「注意」不是所有的容器都有/bin/bash,因适具体情况而定,但通常都有/bin/sh

从容器内拷贝文件到宿主机上

「注意」是把容器内的文件 拷贝到 外面宿主机上

docker cp 容器id:容器内路径 目的主机路径

导出和导入容器

# 导出容器
## 导出容器 1e560fca3906 快照到本地文件 ubuntu_001.tar
docker export 1e560fca3906 > ubuntu_001.tar

# 导入容器快照
## 将快照文件 ubuntu_001.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu_001.tar | docker import - test/ubuntu:v1

# 也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo

查看 docker 容器日志

docker logs [可选参数] [ID或者名字]

# 查看容器内部的标准输出
docker logs [ID或者名字]

# 查看容器日志
docker logs -f -t --tail 10 [ID或者名字]
-f      # 跟踪实时日志
-t      # 显示时间戳
-tail 10   # 表示查看最后的10条日志

查看 docker 各个容器的cpu占用率

docker stats

查看 docker 容器的元数据

docker inspect [容器ID]

# 可以看到对应容器的 完整id、创建时间、当前状态、挂载信息、网络等等;

Docker 容器与宿主机 映射

docker run -d -P mrhjx/webapp python
-P      # (大写)容器内部端口随机映射到主机的高端口。	
-p      # (小写)容器内部端口绑定到指定的主机端口	

docker run -d -p mrhjx/webapp python

# 另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 mrhjx/webapp python

# 以上,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp	
docker run -d -p 127.0.0.1:5000:5000/udp mrhjx/webapp python

CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        mrhjx/webapp     "python"   ...   	5000/tcp, 127.0.0.1:5000->5000/udp   	drunk_visvesvaraya
95c6ceef88ca        mrhjx/webapp     "python"   ...    	5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        mrhjx/webapp     "python"   ...     0.0.0.0:5000->5000/tcp             	berserk_bartik
fce072cc88ce        mrhjx/webapp     "python"   ...    	0.0.0.0:32768->5000/tcp             	grave_hopper

# docker port 命令可以让我们快捷地查看端口的绑定情况。	
docker port adoring_stonebraker 5000

Docker 数据挂载

volume卷

# 查看所有volume的情况
docker volume ls

匿名挂载、具名挂载、指定路径挂载。

# 匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx # 从nginx镜像中启动容器,并在后台运行,并命名为nginx01,随机端口映射,将容器内/etc/nginx挂载到外部

# 具名挂载
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

# 指定路径挂载
# -v 宿主机路径:容器内路径
docker run -d -P --name nginx01 -v /home/deq/nginx:/etc/nginx nginx

## ro 和 rw
ro      readonly    # 只读
rw      readwrite   # 可读可写
# 例
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx # ro 只能从宿主机操作数据,容器内无法操作
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx


## 匿名挂载 和 具名挂载 都挂载到了外部,但我们不知道具体位置在哪,如何查看呢?
# 查看卷的具体情况
docker inspect 容器id
# 内容的Mounts即为挂载详情

# 查看卷的具体情况
docker volume inspect 卷名

继承挂载

--volumes-from

Docker网络,容器互联

Docker自身的4种网络模式

网络模式 说明
Host 使用宿主机的网络
Bridge 桥接模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信
None 不配置网络
Container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围 (用的少)
其它

查看已创建docker网络

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
54bb3ace18bb        bridge              bridge              local
0289624a7431        host                host                local
02335b90621e        none                null                local

# 上面三个网络是Docker内置的

四种网络模式工作图解:https://www.jianshu.com/p/22a7032bb7bd

在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

  • host模式:使用 --net=host 指定。
  • none模式:使用 --net=none 指定。
  • bridge模式:使用 --net=bridge 指定,默认设置。
  • container模式:使用 --net=container:NAME_or_ID 指定。

容器互联

使用Bridge模式网络 实现容器互联:

新建(自定义)一个Bridge模式的网络(相当于新建一个网桥)

docker network create -d bridge test-net    # 创建了一个test-net网络
参数:
    -d:指定 Docker 网络类型,有 bridge、overlay。
    (overlay网络用于连接不同机器上的docker容器, 用于 Swarm mode)
    
# 可以指定子网和网关:
docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 test-net

# 配置子网192.168.0.0, 掩码位16代表范围为:192.168.0.0 至 192.168.255.255
# 若子网配置掩码位是24,则范围为:192.168.0.0 至 192.168.0.255
# 指定网关192.168.0.1

容器加入网络

# 运行一个容器并连接到新建的 test-net 网络:	
docker run -itd --name test1 --network test-net ubuntu /bin/bash
参数:
    -i 保持交互界面
    -t 分配一个虚拟的终端(-it总是一起出现的,用来进入一个容器)
    -d 在后台运行容器并打印容器 ID
    --name 自定义容器名
    --network 连接网络

打开新的终端,再运行一个容器并加入到 test-net 网络:

docker run -itd --name test2 --network test-net ubuntu /bin/bash

通过 ping 来证明 test1 容器和 test2 容器建立了互联关系

如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping
apt-get update
apt install iputils-ping

在 test1 容器输入以下命令:
ping test1

若ping通,则test1 容器和 test2 容器成功建立了互联关系。

  • 配置 DNS

Docker 仓库管理

发布自己的镜像到DockerHub 或者 阿里云

需要先登录docker

docker login -u 账号


# 使用 docker logout 可以退出登录

发布至DockerHub

地址:https://hub.docker.com/

docker push 仓库名:版本

发布至阿里云

地址:https://www.aliyun.com/

登录阿里云,找到【容器镜像服务】

创建镜像仓库,完成后点击管理,里面有使用文档(发布步骤)