Docker概述
Docker简介
Docker是一个开源的、基于LXC技术(Linux Container)的容器引擎,基于Go语言开发,并遵守Apache2.0协议开源。
Docker的特点
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。
使用Linux容器来部署应用称为集装箱化,这使得Docker可以轻松部署应用程序。
集装箱化的优点:
- 隔离环境:资源和环境是隔离的,容器不会影响到宿主机。
- 沙箱机制:不同的集装箱之间不会相互影响。
- 易移植:在docker中运行的应用程序很容易从一个平台迁移到另一个平台而不用担心运行环境变化导致程序无法运行。可以在本地构建,部署到云上并可以在任何地方运行。
- 灵活封装:即使是复杂的应用程序也可以封装,Docker可以让开发者打包他们的应用以及依赖包到一个容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 轻量、性能高:资源利用率高,性能开销极低。在一台机器上可以轻松运行多个Docker容器,他们共享这台机器的内核,可以迅速启动,并且占用很少的计算和内存资源。
- 易扩展:可以增加和自动分发容器副本。
- 可堆叠:可以垂直堆叠服务并及时堆叠服务。
Docker的安装和使用
安装环境准备——Linux虚拟机
Docker官方是建议在Ubuntu中安装,我电脑系统是Windows所以决定使用Linux虚拟机,我们使用的是虚拟电脑,直接导入OVF即可使用。
导入后先正常启动,用户名是root,密码是javasm,然后使用ifconfig
命令查看ip地址
然后关闭后,选择无界面运行,然后使用客户端软件连接,本文使用的是mRemoteNG。
Docker的安装
安装Docker CE (Docker Community Edition) 即社区免费版
docker依赖性检查:
Docker需要一个64位系统的红帽系统,内核的版本必须大于3.10,可以通过下面的命令来查看linux内核版本:
uname -r
安装docker容器引擎:
有多种方法可以安装docker,本文采用yum在线安装。
首先查看是否安装过,命令如下:
yum list installed | grep docker
本机的执行效果:
如果有已经安装,删除旧的docker,命令如下:
#相关的都删除
yum remove docker-ce
#或分别删除
sudo yum remove docker-ce \
docker-ce-cli \
提示:若有2017年之前的旧版本,需要如下删除:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
清除默认的docker目录,其中包含了之前的镜像和容器文件、配置等。
rm -rf /var/lib/docker
提示:该目录是docker服务启动后自动生成的。
安装一些必要的系统工具(否则没有下面的yum-config-manager命令):
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
yum makecache fast
安装Docker:
#必须先更新yum源,否则找不到docker-ce,只能找到docker
#查看所有仓库中所有docker版本
yum list docker-ce --showduplicates|sort -r
#直接安装Docker CE (will always install the highest possible version,可能不符合你的需求)
yum -y install docker-ce
#或选择安装64位的版本:
#yum install docker-ce.x86_64
#或选择特定版本安装,比如这里的版本是19.03.0.ce:
yum -y install docker-ce-19.03.0.ce
验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
方式一:查看已经安装后的软件:
yum list installed | grep docker
有client和service两部分表示docker安装启动都成功了:
方式二:查看docker的版本号
docker -v
本机输出如下:
或
docker version
本机输出如下:
Docker服务的启动停
刚安装好的Docker并没有启动,需要通过系统服务命令的方式来启动。
比如:要运行查看Docker的概要信息的命令info
:
docker info
控制台会出现:
[root@localhost ~]# docker info
Client:
Debug Mode: false
Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
在Centos7中,可以使用系统服务管理器指令systemctl
来启动Docker服务,该命令可以认为是 service
和 chkconfig
两个命令组合。Centos6中只能使用service
指令。
相关命令如下:
查看docker服务的启动状态
systemctl status docker
启动docker服务:
systemctl start docker
停止docker服务:
systemctl stop docker
重启docker服务:
systemctl restart docker
加入到开机启动(生产环境下一般要系统启动时自动运行Docker服务):
systemctl enable docker
查看docker所有命令:
docker --help
操作前的一些准备
Docker的几个概念
Docker中的几个概念:
- 镜像(images):镜像是构建 Docker 容器的基石,类似虚拟机镜像,Docker镜像是由文件系统叠加而成(是一种文件的存储形式),本节暂不研究。
- 容器(Container):容器是镜像的一个运行实例,是一个运行环境,类似linux系统环境
- 注册中心(Registry):注册中心来保存用户构建的镜像,注册服务器是存放仓库的地方。根据存储的镜像公开分享与否,Docker仓库分为公开仓库(Public)和私有仓库(Private)两种形式。Docker 公司运营公共的Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像。本文先使用默认的Docker Hub。
- 仓库(Repository):注册中心服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag 标记,类似于版本号)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04,12.04等不同版本的镜像。
配置注册中心的国内加速镜像(Mirror)
官方docker服务器在国外,比较慢。一般要配置使用国内注册中心加速镜像。
常见的加速镜像地址:
- 中科大镜像:
- 中科大Docker加速镜像地址:https://docker.mirrors.ustc.edu.cn
- 中科大Docker加速镜像官网说明:https://lug.ustc.edu.cn/wiki/mirrors/help/docker
- 中科大Linux加速镜像官网说明:https://mirrors.ustc.edu.cn/
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
- Docker中国区官方镜像:
- Docker中国官方镜像加速-地址:https://registry.docker-cn.com
- Docker中国官方镜像加速-官网说明:https://www.docker-cn.com/registry-mirror
- 阿里的docker镜像,需要注册,详情网上查,本文不采用。
本文使用中科大的镜像。配置方法如下:
编辑daemon.json文件(没有该文件的话,请先建一个):
vim /etc/docker/daemon.json
在daemon.json中编辑如下代码:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
配置完成后,一定要重启docker服务才能生效:
systemctl daemon-reload && systemctl restart docker
验证:通过info
命令可以查看到如下图的标识的内容,说明加速镜像地址配置成功且生效了:
Image镜像操作
查找镜像
需求:
查询一下Docker Hub上有没有需要的镜像。
语法:
docker search [OPTIONS] TERM
Name, shorthand | Default | Description |
---|---|---|
--automated | deprecated Only show automated builds | |
--filter , -f | Filter output based on conditions provided | |
--format | Pretty-print search using a Go template | |
--limit | 25 | Max number of search results |
--no-trunc | Don’t truncate output | |
--stars , -s | deprecated Only displays with at least x stars |
示例:
列出Docker Hub上包含“centos”关键字的的镜像:
docker search centos
- NAME:仓库名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
拉取镜像
说明:
从注册中心上拉取下载需要的镜像。
语法:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
选项参数:
Name, shorthand | Default | Description |
---|---|---|
--all-tags , -a | Download all tagged images in the repository | |
--disable-content-trust | true | Skip image verification |
--platform | experimental (daemon)API 1.32+ Set platform if server is multi-platform capable | |
--quiet , -q | Suppress verbose output |
【示例】
(1)拉取centos仓库中的镜像
docker pull centos
docker镜像名字组成:仓库名字:标记
,如centos:7.6.1810
标记一般是类似于版本号的组成方式,它支持x.y.z
语义化版本方式,并能自动识别。
比如拉取镜像操作中的使用:
centos:7.6.1810----->下载的就是7.6.1810
centos:7.6 ------->下载7.5.最高版本 的版本
centos:7 ------->下载7系列最高的版本
centos:6 ------->下载6系列最高的版本
centos:latest ------->下载最高的版本,省略版本号时就是latest
centos ------->下载最高的版本,省略版本号时就是latest
如果要下载指定版本的镜像,可以执行命令:
docker pull centos:7.6.1810
如果冒号后面的标记不写,将使用默认的标记latest,即下载的是centos最新版本,即相当于下载的命令为:
docker pull centos:latest
因为最新版本不断的会更新,因此,企业中使用Docker一般会使用完整的语义化版本的标记方式。
查看镜像
说明:
查看本地已有的镜像,镜像可以是下载的,也可以是自己构建的。
语法:
docker images [OPTIONS] [REPOSITORY[:TAG]]
选项参数:
Name, shorthand | Default | Description |
---|---|---|
--all , -a | Show all images (default hides intermediate images) | |
--digests | Show digests | |
--filter , -f | Filter output based on conditions provided | |
--format | Pretty-print images using a Go template | |
--no-trunc | Don’t truncate output | |
--quiet , -q | Only show numeric IDs |
示例:
列出本地所有的镜像:
docker images
根据仓库名字和标记来列出本地镜像,
#列出"centos"仓库中的所有镜像:
docker images centos
#列出标记为7.6.1810的"centos"仓库中的所有镜像:
docker images centos:7.6.1810
#列出镜像信息中有centos的镜像
docker images |grep centos
本地镜像删除
说明:
删除一个或多个镜像
语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
选项:
More ActionsName, shorthand | Default | Description |
---|---|---|
--force , -f | Force removal of the image | |
--no-prune | Do not delete untagged parents |
【示例】
删除centos的镜像:
docker rmi centos
删除所有镜像:
docker rmi `docker images -q`
Container容器操作
查看容器
用途:列出容器。
语法:
docker ps [OPTIONS]
(1)列出所有正在运行的容器:
docker ps
(2)显示所有容器,包括正在运行的和停止的:
docker ps -a
- -a:显示正在运行的和停止的容器。该参数也可以写成
--all
或--all=true
。
(3)查看停止了的容器列表:
docker ps -f status=exited
#或
docker ps -a |grep exited
- -f:过滤结果,该参数也可以写成
--filter
。 - status:是
-f
参数中的参数,指的是容器的状态,该状态的值有:created
,restarting
,running
,removing
,paused
,exited
,或dead
。
容器的创建运行
用途:创建一个新的容器并自动运行,且可以在该容器上执行命令。
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
该命令参数特别的多,无需都查看,后续根据需求去官网手册选择合适的选项参数即可。
有两种方式运行容器,一种是交互式容器,另一种是守护式容器。
(一)交互式容器
创建一个用于测试的容器,容器创建成功后自动分配伪终端,可进行人机交互。
创建运行一个centos的容器:
docker run -it --name=mycentos centos:7.6.1810 bash
#或
docker run -i -t --name=mycentos centos:7.6.1810 bash
#或
docker run --interactive=true --tty=true --name=mycentos centos:7.6.1810 /bin/bash
- -i:保持标准输入(STDIN)打开,可实现交互式输入输出。该参数也可以写成
--interactive=true
。 - -t:分配一个伪终端(pseudo-TTY:伪终端、虚拟控制台),用于交互式的输入输出,必须有
-t
参数。该参数也可以写成--tty =true
。 - bash:分配伪终端时要在容器上执行的执行,这里使用的linux的bash脚本命令,该命令完整写法为
/bin/bash
。
【提示】:
run
和镜像名字之间的选项没有顺序,但命令必须放到镜像名字之后。
优点:
创建完容器后,自动运行容器,并可以直接进入到子容器系统中操作了,主要用于测试使用。
缺点:
当退出子容器后,该容器会自动停止运行。
(二)守护式容器:
创建一个需要长期运行的容器,就可以创建一个守护式容器(后台运行的容器),下面的命令用于在后台创建运行容器并打印容器ID:
docker run -id --name=mycentos2 centos:7
#或
docker run -id --name mycentos2 centos:7
- -d:在后台运行容器并打印容器ID。该参数也可以写成
--detach
或--detach=true
。
提示:
该容器的运行需要打开标准输入(-i
参数),否则无法运行。但对于很多容器来说,无需标准输入,则无需使用-i
参数,只需要-d
即可。不管是否需要标准输入,加上-i
的参数暂无发现有副作用。
登录守护式容器方式:
docker exec -it container_name (或者 container_id) /bin/bash(exit退出时,容器不会停止)
比如:
方式1:使用名字进入
docker exec -it mycentos2 bash
[root@2c32a5cb4a71 /]#
方式2:使用id进入
docker exec -it 2c32a5cb4a71 bash
[root@2c32a5cb4a71 /]#
优点:
从守护式容器中退出,并不影响容器的运行。
缺点:
必须的手动命令进入到容器。
run命令的本质是两个命令的结合:create+start
容器的停止启动挂起
(一)容器的停止
说明:
停止一个或多个正在运行的容器
语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
选项:
Name, shorthand | Default | Description |
---|---|---|
--time , -t | 10 | Seconds to wait for stop before killing it |
【示例】
停止正在运行的mycentos2容器:
docker stop mycentos2
(二)容器的启动
说明:
启动一个或多个已经停止了的容器
语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
【示例】
启动mycentos2容器:
docker start mycentos2
(三)重启容器
说明:
重启一个或多个容器。
语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
【示例】
重启mycentos2容器:
docker restart mycentos2
(四)暂停容器
说明:
暂停(挂起)一个或多个容器中的进程。
语法:
docker pause CONTAINER [CONTAINER...]
【示例】
暂停挂起mycentos2容器:
docker pause mycentos2
(五)取消暂停容器
说明:
取消暂停(挂起)一个或多个容器中的进程
语法:
docker unpause CONTAINER [CONTAINER...]
【示例】
取消暂停挂起mycentos2容器:
docker pause mycentos2
文件拷贝
说明:
在容器和本地文件系统之间复制文件/文件夹。
语法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
如:将宿主机的文件拷贝到mycentos2中
#在宿主机上创建一个空文件test.txt
touch test.txt
#将test.txt拷贝到mycentos2容器的根目录中:
docker cp test.txt mycentos2:/
也可以将文件从容器内拷贝出来
#在宿主机先删除test.txt文件
rm -f test.txt
#将mycentos2容器中的根目录的test.txt拷贝到宿主机的当前目录中:
docker cp mycentos2:/test.txt ./
目录的映射挂载
说明:
宿主机的目录的挂载映射到容器中。
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
语法:
docker run -v `宿主机目录`:`容器目录` [--read-only] image
- -v:将当前工作目录装载到容器中。绑定装载卷的宿主机目录不存在时,Docker会自动在宿主机上为您创建这个目录。
- –read-only:将容器的根文件系统安装为只读。卷的挂载可以与只读标志选项
--read-only
结合使用,用于控制容器对文件是否能写入。只读标志将容器的根文件系统挂载为只读,禁止向容器指定卷以外的位置写入。容器中只有挂载的目录是可写的,其他的目录无法写入,从而保护容器。
【示例】
将宿主机上的/root/myvolume
目录挂载到mycentos3
中的/myvolume
目录中:
#进入到宿主机目录,建立新目录和新的文件:
#mkdir myvolume
docker run -id --name=mycentos3 -v /root/myvolume:/myvolume centos:7.6.1810
容器的删除
说明:
删除一个或多个容器。
语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
【示例】
(1)先停止运行的mycentos3的容器,再删除它。
docker stop mycentos3
docker rm mycentos3
提示:
上述命令默认只能删除停止了的容器。若容器是启动的状态,则可以先停止容器,再删除。
(2)直接强制删除正在运行的mycentos2容器
docker rm -f redis
#或者
docker rm --force redis
(3)强制删除所有的容器
docker rm -f `docker ps -qa`
#或
docker rm -f $(docker ps -a -q)
(4)删除容器时,将其关联的卷也删掉
此命令将删除容器及其关联的任何卷。请注意,如果使用名称指定了卷,则不会删除该卷。
docker create -v awesome:/foo -v /bar --name hello redis
docker rm -v hello
在此示例中,/foo的卷将保持不变,但/bar的卷将被删除。对于继承了–volumes-from的卷,同样的行为也适用。
部署
Redis部署
目标:使用Docker部署一个Redis,并通过客户端连接访问。
第一步:拉取Redis镜像
docker pull redis:5.0.5
第二步:创建Redis容器
docker run -d --name=my_redis -p 6379:6379 redis:5.0.5
- -p:代表端口映射,格式为 宿主机映射端口:容器运行端口
redis-cli -h 192.168.40.141 –p 6379
MySQL部署
目标:使用Docker部署一个MySQL,并通过客户端连接访问。
第一步:拉取MySQL镜像
docker pull mysql:8.0.17
提示:如果已经下载过到本地了,则无需下载。
第二步:创建MySQL容器并映射端口和改密码
docker run -di --name=my_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.17
- -e:代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
Tomcat部署
目标:使用Docker部署一个Tomcat,并部署应用来访问。
第一步:拉取tomcat镜像
docker pull tomcat:8.5.43
第二步:创建tomcat容器
创建容器,并映射端口等
docker run -id --name=my_tomcat -p 9001:8080 -v ~/myvolume:/usr/local/tomcat/webapps tomcat:8.5.43
或
docker run -id --name=my_tomcat3 -p 9003:8080 -v ~/myvolume:/usr/local/tomcat/webapps --privileged=true tomcat:8.5.43
备份与迁移
容器提交为新镜像
说明:
根据容器的更改创建新镜像,即基于原始镜像,将其运行的容器中更改的内容,来生成新的镜像。
语法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
将my_redis
容器提交为一个新的镜像myredis:1.0.1
:
docker commit my_redis myredis:1.0.1
运行结果:本地镜像中新增了myredis:1.0.1
的镜像
简单快速测试:使用自定义的镜像来运行容器,发现也可正常使用。
镜像的保存
说明:将一个或多个镜像保存到tar存档(默认流到标准输出-STDOUT)
语法:
docker save [OPTIONS] IMAGE [IMAGE...]
(1)创建一个镜像的备份到磁盘文件:
docker save -o myredis-1.0.1.save.tar myredis:1.0.1
#或
docker save myredis:1.0.1 > myredis-1.0.1.save.tar
(2)镜像打包时使用gzip压缩,可以让备份的文件更小(建议):
docker save myredis:1.0.1 | gzip > myredis-1.0.1.save.tar.gz
(3)将某个仓库的所有镜像打包:
docker save -o xxx.tar 仓库名字
#如
docker save -o redis.tar redis
提示:不指定标记就是打包所有该仓库的镜像。
(4)对多个镜像打包备份到一个磁盘文件:
docker save -o xxx.tar 镜像1 镜像2...
#如将redis所有标记版本镜像和ngix的1.17.2版本的镜像,都打包到一个文件中。
docker save -o mybak20190726.save.tar redis nginx:1.17.2
【应用场景】
docker save的主要应用场景是,你要部署的客户服务器并不能连外网。这时,你可以使用docker save将用到的相关镜像打个包,然后拷贝到客户服务器上,再使用docker load一次性载入。
(2)镜像打包时使用gzip压缩,可以让备份的文件更小(建议):
docker save myredis:1.0.1 | gzip > myredis-1.0.1.save.tar.gz
镜像的加载
说明:
从tar归档文件或标准输入(stdin)加载镜像,归档文件即使是使用gzip、bzip2或xz压缩后的,也能自动识别和处理。
语法:
docker load [OPTIONS]
先删除已有的镜像,然后通过备份的归档文件加载还原镜像到docker中:
docker load -i myredis-1.0.1.save.tar
#或
docker load < myredis-1.0.1.save.tar