Docker基础
Docker基础
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以和管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker提供了在简单、隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使您可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。您甚至可以在虚拟机的主机中运行Docker容器!
Docker提供了工具和平台来管理容器的生命周期:
- 使用容器开发应用程序及其支持组件。
- 容器成为分发和测试应用程序的单元。
- 准备就绪后,可以将应用程序作为容器或协调服务部署到生产环境中。无您的生产环境是本地数据中心,云提供商还是两者的混合,其工作原理都相同。
Docker引擎
Docker是具有以下主要组件的客户端-服务器应用程序。
- 以守护程序进程的方式运行。
- 使用
REST API
与守护程序进行通信并指示其操作的接口。 - 命令行界面(CLI)客户端(
docker
命令)。
Docker架构
Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
Docker安装
通常情况下,我们有两种安装Docker的方式,一种是:
yum
,另一种是二进制安装包。Docker一般情况下是安装在Ubuntu
中,因为其内核版本比较高,本次咱们采用CentOS 7
。
在CentOS上安装
-
在阿里云上下载docker-ce.repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoCopy to clipboardErrorCopied
-
安装基础包
yum install -y yum-utils device-mapper-persistent-data lvm2Copy to clipboardErrorCopied
-
刷新缓存
yum makecache fastCopy to clipboardErrorCopied
-
安装
# 如果是CentOS 8需要安装下面的包 wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm yum localinstall containerd.io-1.2.13-3.2.el7.x86_64.rpm -y yum -y install docker-ceCopy to clipboardErrorCopied
-
启动
systemctl enable --now dockerCopy to clipboardErrorCopied
-
验证
[root@localhost ~]# docker info Client: Debug Mode: false Server: Containers: 15 Running: 5 Paused: 0 Stopped: 10 Images: 26 Server Version: 18.09.9 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: systemd Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 4.18.0-80.11.2.el8_0.x86_64 Operating System: CentOS Linux 8 (Core) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.92GiB Name: localhost.localdomain ID: FLZM:42YD:NC2K:NATO:YPCA:T6IY:G647:OKPA:WJKK:Z4TQ:AN7R:TMSB Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://hjvrgh7a.mirror.aliyuncs.com/ Live Restore Enabled: false Product License: Community EngineCopy to clipboardErrorCopied
在Ubuntu上安装
-
安装必要的一些系统工具
apt-get -y install apt-transport-https ca-certificates curl software-properties-commonCopy to clipboardErrorCopied
-
安装
GPG
证书curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -Copy to clipboardErrorCopied
-
写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"Copy to clipboardErrorCopied
-
更新并安装
Docker-CE
sudo apt-get -y update sudo apt-get -y install docker-ceCopy to clipboardErrorCopied
-
添加配置
添加配置
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://hjvrgh7a.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOFCopy to clipboardErrorCopied
基本使用
Docker容器中至少有一个应用程序运行在前台。
创建容器
docker run -it centos bashCopy to clipboardErrorCopied
docker run:有两个过程:
- 检测当前使用的镜像本地是否有,没有则去远程仓库拉取。
- 将镜像实例化成容器。
在docker容器中,至少要有一个应用程序运行在前台,否则在启动的一瞬间生命周期就结束了。
为什么加上-it参数之后,就可以了呢?因为伪终端是运行在前台的。
进入容器
在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。
acctch
使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。
[root@instance-gvpb80ao docs]# docker attach nginx
127.0.0.1 - "GET / HTTP/1.1" 308 171 "-" "curl/7.59.0" 0.000 - .Copy to clipboardErrorCopied
exec
这个命令相当于在容器中执行一个命令。官方推荐
[root@instance-gvpb80ao docs]# docker exec -it nginx /bin/bash
nginx [ / ]$
nginx [ / ]$Copy to clipboardErrorCopied
nsenter
需要配合docker inspect来使用(企业当中最长用的方式之一),Docker是用golang语言开发,所以它也支持go语言的摸版语法。
[root@instance-gvpb80ao docs]# nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@6f99ae8757f7:/#Copy to clipboardErrorCopied
SSH
在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。
总结
进入docker container中一般情况下有4种方式,最常用的是exec和nsenter这两种。
- Nsenter和exec之间的区别?
- Exec是docker自带的命令,Nsenter是Linux提供的命令。
- Exec相当于在容器内执行一个命令,而Nsenter是仅仅进入容器之中而已。
端口映射
docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
固定端口
指定端口映射
[root@instance-gvpb80ao docs]# docker run -d -p 8099:80 nginx
5e3c9d5eba477dc7a0e23cc661916d2a7545bc6e65a2de5660e2e20d0abf6fe2
[root@instance-gvpb80ao docs]# docker ps | grep 8099
5e3c9d5eba47 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8099->80/tcp cool_williamsonCopy to clipboardErrorCopied
随机端口
[root@instance-gvpb80ao docs]# docker run -d --name ppp -P nginx
914e31c98f9b7c3df226076272f4d5b9a2cf99ff3b578baf792eaace4ea6dc7e
[root@instance-gvpb80ao docs]# docker ps | grep ppp
914e31c98f9b nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:32768->80/tcp pppCopy to clipboardErrorCopied
复制文件
我们在使用容器的过程中,难免的想临时的与宿主主机之间交换文件。
从容器内复制到容器外
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
[root@instance-gvpb80ao docs]# docker cp daf9c3656be3:/usr/share/nginx/html/index.html .
[root@instance-gvpb80ao docs]# ll | grep index
-rw-r--r-- 1 root root 612 8月 11 22:50 index.htmlCopy to clipboardErrorCopied
从容器外复制到容器内
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
[root@instance-gvpb80ao docs]# docker cp test.yaml daf9c3656be3:/usr/share/nginx/html/
[root@instance-gvpb80ao docs]# docker exec daf9c3656be3 ls /usr/share/nginx/html
50x.html
index.html
test.yamlCopy to clipboardErrorCopied
镜像的导入与导出
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。
使用 export 和 import
export 和 import的针对点是容器,将本机的容器导出为镜像包。
- 使用
export
保存容器为镜像
[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 9月 24 20:51 nginx.tarCopy to clipboardErrorCopied
- 使用
import
导入包为镜像
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@instance-gvpb80ao docs]# docker images | grep test
test/nginx v1 02107323de1b 22 seconds ago 131MBCopy to clipboardErrorCopied
使用 save 和 load
save 和 load的正对点是镜像,将本机的镜像导入、导出为镜像包。
- 使用
save
保存镜像
[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root 1458176 9月 24 21:01 busybox.tarCopy to clipboardErrorCopied
- 使用
save
保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0Copy to clipboardErrorCopied
- 使用
load
导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox latest 6858809bf669 2 weeks ago 1.23MBCopy to clipboardErrorCopied
两种方案的差别
-
文件大小不同
- export导出的镜像文件体积小于 save 保存的镜像
-
是否可以对镜像重命名
docker import
可以为镜像指定新名称docker load
不能对载入的镜像重命名
-
是否可以同时将多个镜像打包到一个文件中
docker export
不支持docker save
支持
-
是否包含镜像历史
-
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
-
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
[root@instance-gvpb80ao docs]# docker history 6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3 IMAGE CREATED CREATED BY SIZE COMMENT 6858809bf669 2 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:72be520892d0a903d… 1.23MBCopy to clipboardErrorCopied
-
-
应用场景不同
docker export
的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export
保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。docker save
的应用场景:如果我们的应用是使用docker-compose.yml
编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save
将用到的镜像打个包,然后拷贝到客户服务器上使用docker load
载入。
docker地址参考
# docker官网:
https://docs.docker.com/
# docker github地址:
https://github.com/docker/docker
# docker hub 官网
https://registry.hub.docker.com
# 镜像加速器地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
docker使用语法
# 镜像
查看官网镜像:docker search centos
下载镜像:docker pull centos
查看镜像:docker images
删除镜像:docker rmi centos
启动容器
#以交互式方式启动并进入到容器(ctrl+p,ctrl+q退出容器或者输入exit,这样容器可以在后台运行):
docker run --name=hello -it centos /bin/bash
# 以守护进程方式启动容器
docker run --name=hello1 -itd centos /bin/bash
# 查看正在运行的容器
docker ps
# 停止容器
docker stop 容器名
# 启动已经停止的容器
docker start 容器名
# 进入容器
docker exec -it hello /bin/bash
# 查看端口映射情况
docker port nginx
# 创建一个映射了80端口的交互式容器
docker run --name nginx -p 88:80 -itd centos /bin/bash
进入容器
# 进入容器名为nginx的容器
docker exec -it nginx /bin/bash
Docker容器的数据卷
数据卷特点描述
# 设计目的:
在于数据永久性,docker不会在容器删除时删除其挂载的数据卷,同一个数据卷可以支持多个容器的访问。
# 特点:
1.数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
2.数据卷可以在容器之间共享和重用
3.可以对数据卷里的内容直接进行修改
4.数据卷的变化不会影像镜像的更新
5.卷会一直存在,即使挂载数据卷的容器已经被删除
数据卷的使用
# 为容器添加数据卷(宿主机/datavolue挂载到容器/data目录)
docker run -v /datavolume:/data -it centos /bin/bash
# 为数据卷添加访问权限(docker容器/data目录下不能创建文件,仅只读,宿主机/datavolue1可创建文件)
docker run --name volume1 -v ~/datavolume1:/data:ro -itd centos /bin/bash
容器挂载数据卷
# 什么是数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器
容器挂载数据卷方式
docker run --volumes-from [container name]
# 例:
` 创建centos容器,将宿主机挂载至容器中`
docker run --name data-volume -v ~/datavolume1:/data -itd centos
` 创建一个新的容器挂载刚才data-volume这个容器的数据卷`
docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
` 验证`(查看在容器2中是否存在容器1目录)
docker exec -it data-volume2 /bin/bash
docker数据卷的备份和还原
# 实现原理(备份)
创建新容器时挂载基于需要备份容器,在新容器中即可共享老容器数据,并且在启动新容器时再次创建一个挂载,进入新容器,将老容器的数据备份,存放至新容器的挂载点,同时,数据也就保存到了宿主机
# 实现原理(还原)
创建新容器时挂载基于需要备份容器,在新容器中即可共享老容器数据,并且在启动新容器时再次创建一个挂载,进入新容器,将宿主机挂载到新容器数据还原至共享老容器数据存储目录。
# 备份方式
docker run --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]
# 例:
docker run --volumes-from 老容器名 -v /root/backup:/backup --name 新容器名称 centos tar zcvf /backup/data-volume2.tar.gz /datavolume6
# 备份数据还原:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar xzvf /backup/backup.tar.gz -C [container data volume]