Docker快速入门
第 3 章 Docker快速入门
3.1 docker快速入门
学习目标:
了解 docker特点和场景
应用 docker环境部署
3.1.1 docker是什么
这一节,我们从定义、场景、历史这三个方面来学习
docker是什么?
Docker is the company driving(推动) the container movement and the only container platform provider to address every application across the hybrid cloud(混合云). Today’s businesses are under pressure to digitally transform(数字化转型) but are constrained(限制) by existing applications and infrastructure while rationalizing an increasingly diverse portfolio of clouds, datacenters and application architectures. Docker enables true independence between applications and infrastructure and developers and IT ops to unlock their potential and creates a model for better collaboration and innovation.

Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决生产问题的一种技术手段。
Docker生活场景:

图一:动画片《七龙珠》里面的胶囊 图二:1号胶囊启动后的效果
官方资料:
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
Docker理念
构建:
龙珠里的胶囊,将你需要的场景构建好,装在一个小胶囊里
运输:
随身携带着房子、车子等,非常方便
运行:
只需要你轻轻按一下胶囊,找个合适的地方一放,就ok了
优缺点
优点:
多: 适用场景多
快: 环境部署快、更新快
好: 好多人在用,东西好
省: 省钱省力省人工(123原则)
缺点:
太腻歪人: 依赖操作系统
不善于沟通:依赖网络
不善理财: 银行U盾等场景不能用
3.1.2 部署docker
这一节,我们从软件源配置、基础软件安装、docker安装六个方面来学习
软件源配置
官网参考:
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#upgrade-docker-after-using-the-convenience-script
基础软件源
cd /etc/apt/
mv sources.list sources.list.bak
vim sources.list
# sohu shangdong
deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
# 163 guangdong
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
# tsinghua.edu
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# aliyun
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# neu.edu
deb http://mirror.neu.edu.cn/ubuntu/ xenial main restricted universe multiverse partner
deb http://mirror.neu.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirror.neu.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
安装依赖软件
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common -y
使用官方推荐源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
使用阿里云的源{推荐1}
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
使用清华的源{推荐2}
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
检查
apt-get update
docker软件安装
查看支持的docker版本
apt-cache madison docker-ce
安装docker
apt-get install docker-ce -y
注:
可以指定版本安装docker:
apt-get install docker-ce=<VERSION> -y
启动docker
systemctl start docker
systemctl status docker
注意:
ubuntu安装完毕后,默认就开启服务了
测试docker
docker version
网卡区别:
安装前:只有ens33和lo网卡
安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1
docker服务命令格式:
systemctl [参数] docker
参数详解:
start 开启服务
stop 关闭
restart 重启
status 状态
删除docker命令:
yum remove docker-ce
rm -rf /var/lib/docker/
rm -rf /etc/docker
基本目录
docker基本目录简介
/etc/docker/ docker的认证目录
/var/lib/docker/ docker的应用目录
3.1.3 docker加速器
这一节,我们从加速器简介,加速器配置这两个方面来学习
加速器简介
在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daocloud 的方法进行加速配置。
方法:
访问 daocloud.io 网站,登录 daocloud 账户

点击右上角的 加速器
在新窗口处会显示一条命令,
我们执行这条命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://74f21445.m.daocloud.io
加速器配置
修改daemon.json文件,增加绿色背景字体内容
# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": []}
注意:
docker cloud加速器的默认内容是少了一条配置,所以我们要编辑文件在后面加上绿色背景的内容,然后再重启docker
重启docker
systemctl restart docker
3.2 镜像管理
学习目标:
说出 Docker镜像的定义和作用
应用 Docker镜像的基本操作
3.2.1 镜像简介
Docker镜像是什么?
它是一个只读的文件,就类似于我们安装操作系统时候所需要的那个iso光盘镜像,通过运行这个镜像来完成各种应用的部署。
这里的镜像就是一个能被docker运行起来的一个程序。
3.2.2 搜索、查看、获取、历史
这一节,我们从搜索、查看、获取三个方面来学习
搜索镜像
命令格式:
docker search [image_name]
命令演示:
docker search ubuntu
获取镜像
命令格式:
docker pull [image_name]
命令演示:
docker pull ubuntu
docker pull nginx
注释:
获取的镜像在哪里?
/var/lib/docker 目录下,具体详见docker仓库知识
查看镜像
命令格式:
docker images <image_name>
命令演示:
docker images
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息
docker images -a 列出所有的本地的images(包括已删除的镜像记录)
查看镜像历史
查看镜像历史命令格式:
docker history [image_name]
我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息
3.2.3 重命名、删除
这一节,我们从重命名、删除这两个方面来学习。
镜像重命名
命令格式:
docker tag [old_image]:[old_version] [new_image]:[new_version]
命令演示:
docker tag nginx:latest sswang-nginx:v1.0
删除镜像
命令格式:
docker rmi [image_id/image_name:image_version]
命令演示:
docker rmi 3fa822599e10
注意:
如果一个image_id存在多个名称,那么应该使用name:tag的格式删除镜像
清除状态为dangling的镜像
docker image prune
移除所有未被使用的镜像
docker image prune -a
删除部分镜像
docker image prune -a --filter "until=24h"
3.2.4 导出、导入
这一节,我们从镜像导入、导出两个方面来学习。
导出镜像
将已经下载好的镜像,导出到本地,以备后用。
命令格式:
docker save -o [包文件] [镜像]
docker save [镜像1] ... [镜像n] > [包文件]
注意:
docker save 会保存镜像的所有历史记录和元数据信息
导出镜像
docker save -o nginx.tar sswang-nginx
导入镜像
为了更好的演示效果,我们先将nginx的镜像删除掉
docker rmi nginx:v1.0
docker rmi nginx
导入镜像命令格式:
docker load < [image.tar_name]
docker load --input [image.tar_name]
注意:
docker load 不能指定镜像的名称
导入镜像文件
docker load < nginx.tar
3.3 容器管理
学习目标:
说出 Docker容器的定义和作用
应用 Docker容器的基本操作
3.3.1 容器简介
容器是什么?
容器就类似于我们运行起来的一个操作系统,而且这个操作系统启动了某些服务。
这里的容器指的是运行起来的一个Docker镜像。
3.3.2 查看、启动
这一节,我们从容器查看、启动两个方面来学习。
查看容器
命令格式:docker ps
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注意:
管理docker容器可以通过名称,也可以通过ID
ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器
启动容器
守护进程方式启动容器
命令格式:docker run <参数,可选> [docker_image] [执行的命令]
让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现
docker run -d nginx
启动已终止的容器
在生产过程中,常常会出现运行和不运行的容器,我们使用 start 命令开起一个已关闭的容器
命令格式:docker start [container_id]
3.3.3 关闭、删除
这一节,我们从容器关闭、删除这两个方面来学习
关闭容器
在生产中,我们会以为临时情况,要关闭某些容器,我们使用 stop 命令来关闭某个容器
命令格式:docker stop [container_id]
关闭容器id
docker stop 8005c40a1d16
删除容器
删除容器有两种方法:
正常删除 -- 删除已关闭的
强制删除 -- 删除正在运行的
正常删除容器
命令格式: docker rm [container_id]
docker container prune
删除已关闭的容器
docker rm 1a5f6a0c9443
强制删除运行容器
命令格式:docker rm -f [container_id]
删除正在运行的容器
docker rm -f 8005c40a1d16
删除部分容器
docker container prune --filter "until=24h"
拓展批量关闭容器
命令格式:
docker rm -f $(docker ps -a -q)
3.3.4 进入、退出
这一节,我们从容器进入(三方法)、退出两个方面来学习。
进入容器我们学习两种方法:
1、创建容器的同时进入容器
2、手工方式进入容器
创建并进入容器
命令格式:docker run --name [container_name] -it [docker_image] /bin/bash
~]# docker run -it --name sswang-nginx nginx /bin/bash
root@7c5a24a68f96:/# echo "hello world"
hello world
root@7c5a24a68f96:/# exit
exit
docker 容器启动命令参数详解:
--name:给容器定义一个名称
-i:则让容器的标准输入保持打开。
-t:让docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash:执行一个命令
退出容器:
方法一:exit
方法二:Ctrl + D
手工方式进入容器
命令格式:
docker exec -it 容器id /bin/bash
效果演示:
docker exec -it d74fff341687 /bin/bash
3.3.5 基于容器创建镜像
提交方式:
命令格式:
docker commit -m '改动信息' -a "作者信息" [container_id] [new_image:tag]
命令演示:
进入一个容器,创建文件后并退出
./docker_in.sh d74fff341687
mkdir /sswang
exit
创建一个镜像
docker commit -m 'mkdir /sswang' -a "sswang" d74fff341687 sswang-nginx:v0.2
查看镜像
docker images
启动一个容器
docker run -itd sswang-nginx:v0.2 /bin/bash
进入容器进行查看
./docker_in.sh ae63ab299a84
ls
3.3.6 日志、信息
这一节,我们从日志、详细信息两方面来学习。
查看容器运行日志
命令格式:
docker logs [容器id]
命令效果:
docker logs 7c5a24a68f96
查看容器详细信息
命令格式:
docker inspect [容器id]
命令效果:
查看容器全部信息
docker inspect 930f29ccdf8a
查看容器网络信息
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 930f29ccdf8a
3.4 仓库管理
学习目标:
说出 Docker仓库的定义和作用
应用 Docker仓库的基本操作
3.4.1 仓库简介
这一节,我们从仓库定义、docker仓库、相关命令这三个方面来学习。
仓库定义
仓库是什么?
仓库就类似于我们在网上搜索操作系统光盘的一个镜像站。
这里的仓库指的是Docker镜像存储的地方。
Docker仓库
Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方。
相关命令
和仓库相关的命令:
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]
我们接下来就用registry来部署一个私有的仓库
3.4.2 私有仓库部署
这一节,我们从流程、方案两个方面来学习
创建仓库流程
1、根据registry镜像创建容器
2、配置仓库权限
3、提交镜像到私有仓库
4、测试
实施方案
下载registry镜像
docker pull registry
启动仓库容器
docker run -d -p 5000:5000 registry
检查容器效果
curl 127.0.0.1:5000/v2/_catalog
配置容器权限
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:5000"]}
注意:
私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号
重启docker服务
systemctl restart docker
systemctl status docker
效果查看
启动容器
docker start 315b5422c699
标记镜像
docker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini
提交镜像
docker push 192.168.8.14:5000/ubuntu-14.04-mini
下载镜像
docker pull 192.168.8.14:5000/ubuntu-14.04-mini
3.5 数据管理
学习目标:
说出 数据卷、数据容器是什么
应用 数据卷、数据容器的常见操作
docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?
答案就是:数据卷和数据卷容器
3.5.1 数据卷简介
这一节,我们从定义、命令详解 这两个方面来学习。
什么是数据卷?
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
缺点是:太单一了
docker 数据卷命令详解
# docker run --help
。。。
-v, --volume list Bind mount a volume (default [])
挂载一个数据卷,默认为空
我们可以使用命令 docker run 用来创建容器,可以在使用docker run 命令时添加 -v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中。
-v 参数的作用是将宿主机的一个目录(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
-v 宿主机文件:容器文件
3.5.2 数据卷实践
这一节,我们从目录实践、文件实践两个方面来学习。
关于数据卷的管理我们从两个方面来说:
1、目录
2、普通文件
数据卷实践 之 目录
命令格式:
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test1 -v /tmp:/test1 nginx
测试效果
~# docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1
数据卷实践 之 文件
命令格式:
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]
注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx
测试效果
~# docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1
数据卷实践 之 删除
docker volume rm
docker volume prune
3.5.3 数据卷容器简介
这一节,我们从定义、命令详解、操作流程这三个方面来学习。
什么是数据卷容器?
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
docker 数据卷命令详解
# docker run --help
。。。
-v, --volumes-from value Mount volumes from the specified container(s) (default [])
从指定的容器挂载卷,默认为空
数据卷容器操作流程
如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:
1、创建数据卷容器
2、其他容器挂载数据卷容器
注意:
数据卷容器不启动

3.5.4 数据卷容器实践
这一节,我们从创建、使用、效果查看三个方面来学习。
数据卷容器实践包括两部分:创建数据卷容器和使用数据卷容器
创建一个数据卷容器
命令格式:
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
执行效果
docker create -v /data --name v-test nginx
创建两个容器,同时挂载数据卷容器
命令格式:
docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称] [命令(可选)]
执行效果:
创建 vc-test1 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash
创建 vc-test2 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash
确认卷容器共享
进入vc-test1,操作数据卷容器
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit
进入vc-test2,确认数据卷
~# docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# exit
回到vc-test1进行验证
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2
回到宿主机查看/data/目录
~# ls /data/
~#
结果证明:
容器间可以共享数据卷你容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中
3.6 网络管理
学习目标:
了解 Docker网络模型及其特点
应用 端口映射常见操作
Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式
为什么先学端口映射呢?
在一台主机上学习网络,学习端口映射最简单,避免过多干扰。
3.6.1 端口映射详解
这一节,我们从简介、种类两个方面来学习。
端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过 宿主机的ip+port的方式来访问容器里的内容
端口映射种类
1、随机映射 -P(大写)
2、指定映射 -p 宿主机端口:容器端口
注意:
生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,
不管哪种映射都会影响性能,因为涉及到映射
3.6.2 随机映射实践
这一节,我们从随机映射、指定随机映射这两个方面来学习。
随机映射我们从两个方面来学习:
默认随机映射
指定主机随机映射
默认随机映射
命令格式:
docker run -d -P [镜像名称]
命令效果:
启动一个 nginx 镜像
docker run -d -P nginx
查看效果

注意:
宿主机的32768被映射到容器的80端口
-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1
在浏览器中访问 http://192.168.8.14:32768/,效果显示:

注意:
浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口
指定主机随机映射
命令格式
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
命令效果
docker run -d -p 192.168.8.14::80 --name nginx-2 nginx
检查效果

3.6.3 指定映射实践
这一节,我们从指定端口、指定多端口两个方面来学习。
指定端口映射
命令格式:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
注意:
如果不指定宿主机ip的话,默认使用 0.0.0.0,
容器端口必须清楚,而且必须写出来
命令实践:
现状我们在启动容器的时候,给容器指定一个访问的端口 1199
docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx
查看新容器ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 0ad3acfbfb76
查看容器端口映射

查看宿主机开启端口

查看浏览器效果:

多端口映射方法
命令格式
docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
开起多端口映射实践
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx
查看容器进程


浙公网安备 33010602011771号