学习资料
安装Docker
win10/Linux安装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图解
开始使用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
docker push 仓库名:版本
发布至阿里云
登录阿里云,找到【容器镜像服务】
创建镜像仓库,完成后点击管理,里面有使用文档(发布步骤)