Linux安装Docker
Docker版本:
- 社区版(Community Edition,CE)
- 企业版(Enterprise Edition,EE)
支持平台:
- Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)
- Mac
- Windows
Linux安装Docker
1、更换源:
#安装base reop源
yum install wget -y
cd /etc/yum.repos.d
#接着备份旧的配置文件
mv CentOS-Base.repo CentOS-Base.repo.bak
#下载阿里源的文件
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安装epel repo源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#.清理缓存
yum clean all
#重新生成缓存
yum makecache
#安装epel-release源
yum -y remvoe epel-release
yum -y install epel-release
#yum 安装完之后别忘了清除一下cache
yum clean all
2、安装dockers
【安装文档网址】https://docs.docker.com/
【centos最新安装网址】https://docs.docker.com/engine/install/centos/
【17版本安装网址】https://docs.docker.com/v17.06/engine/installation/linux/docker-ce/centos/#prerequisites
注意:生产环境使用最多是docker-ce-17.12版本
#关闭防火墙和seliunx
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#卸载旧版本的源
sudo yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#安装源。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。
yum install -y yum-utils device-mapper-persistent-data lvm2
#配置源,如果不能配置离线安装或者采用阿里源
#sudo yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
#使用阿里源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#特殊说明。禁用/开启库
#yum-config-manager --disable docker-ce-edge
# --enable docker-ce-edge
#安装docker-ce
sudo yum -y install docker-ce docker-ce-cli containerd.io
#启动docker加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
#docker通过运行hello-world 映像来验证是否已正确安装。
sudo docker run hello-world
#修改docker镜像源,使用加速镜像源
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
sudo systemctl daemon-reload
sudo systemctl restart docker
#查看可用的docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
#:版本字符串是程序包名称加上直到第一个连字符的版本。例如:docker-ce-17.06.1.ce
sudo yum install <FULLY-QUALIFIED-PACKAGE-NAME>
3、卸载docker
#卸载Docker软件包:
sudo yum remove docker-ce
#主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
sudo rm -rf /var/lib/docker
4、docker详情查看
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 20.10.8
Storage Driver: overlay2 #存储驱动目录
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: e25210fe30a0a703442421b0f60afac609f950a3
runc version: v1.0.1-0-g4144b63
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.14.4.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.685GiB
Name: localhost.localdomain
ID: H5AC:HDAI:3HKK:IRQH:EVGE:5ZNQ:XNSQ:QYLL:V3TN:NS6I:AA7V:4FYE
Docker Root Dir: /var/lib/docker #docker文件目录
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
http://f1361db2.m.daocloud.io/
Live Restore Enabled: false
- Client: #docker客户端信息
- Server: #docker服务端信息
- Containers: #容器数量
- Images: #镜像数量
- Server Version: #docker版本
- Storage Driver: #docker的存储驱动目录
- Docker Root Dir: #docker根目录
- Registry Mirrors: #当前使用的镜像源
二、理解容器与镜像
1、镜像是什么?
- 一个分层存储的文件,不是一个单一的文件
- 一个软件的环境
- 一个镜像可以创建N个容器
- 一种标准化的交付
- 一个不包含Linux内核而又精简的Linux操作系统
2、镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共镜像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜 像。
仓库地址:https://hub.docker.com
#配置镜像加速器:
cat >> /etc/docker/daemon.json <<EOF
{ "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] }
EOF
三、理解容器与镜像
- 镜像:类似于虚拟机镜像,一个只读模板
- 容器:通过镜像创建的运行实例
四、管理镜像常用命令
1、docker --help详解
Management Commands(管理命令):
app* Docker App (Docker Inc., v0.9.1-beta3) #Docker应用程序
builder Manage builds #构建管理
buildx* Build with BuildKit (Docker Inc., v0.6.1-docker)
config Manage Docker configs #配置管理
container Manage containers #容器管理
context Manage contexts #上下文管理
image Manage images #镜像管理
manifest Manage Docker image manifests and manifest lists
network Manage networks #网络管理
node Manage Swarm nodes #节点管理
plugin Manage plugins #插件管理
scan* Docker Scan (Docker Inc., v0.8.0)
secret Manage Docker secrets #密钥管理
service Manage services #服务管理
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes #数据卷管理
Commands:
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container's changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path
# 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive
# 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball
# 从tar包中的内容创建一个新的文件系统映像[对应 export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server
# 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
# 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server
# 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server
# 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images
# 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container
# 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code
# 截取容器停止时的退出状态值
2、常用命令
指令 | 描述 |
---|---|
ls | 列出 |
bulid | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到镜像仓库 |
rm | 移除一个或多个镜像 |
prune | 移除没有被标记或者没有被任何容器引用的镜像 |
tag | 创建一个引用源镜像标记目标镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
#列出运行的容器
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec446d3ce93f nginx "/docker-entrypoint.…" 26 minutes ago Up 26 minutes 80/tcp web1
#查看镜像历史
[root@localhost ~]# docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
08b152afcfae 3 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 3 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 3 weeks ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 3 weeks ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 3 weeks ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 3 weeks ago /bin/sh -c set -x && addgroup --system -… 63.9MB
<missing> 3 weeks ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.6.1 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.1 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:45f5dfa135c848a34… 69.3MB #添加rootfs
#查看镜像详细信息
docker inspect nginx
【可参考地址】https://www.cnblogs.com/poloyy/p/13994377.html
#在 https://hub.docker.com 免费注册一个 Docker 账号。
账户:jiawenchao
密码:xxxx521xxxx
#docker拉取镜像(docker pull 镜像名称:tag)
$ docker pull nginx:1.16
#仓库推送镜像,需要先登陆仓库(docker push 仓库地址/仓库名称/镜像名称:tag)
docker login -u jiawenchao -p maba521xxxx #登陆成功
docker tag nginx:1.16 jiawenchao/nginx:1.16 #重新打包
docker push jiawenchao/nginx:1.16 #上传镜像到仓库
docker pull jiawenchao/nginx:1.16 #下载仓库镜像到服务器上
#删除镜像(docker image rm 镜像名称:tag)
docker image rm jiawenchao/nginx:1.16
docker rm $(docker ps -aq) #删除所有没有使用的镜像
docker rm -f $(docker ps -aq) #强制删除所有镜像
#删除没被使用镜像
docker image prune
docker image prune -a #移除所有没被使用镜像
#重新打包(docker tag 初始镜像名称 更新的镜像名称 #重新打包)
docker tag nginx:1.16 jiawenchao/nginx:1.16
#导出修改过后容器为新镜像压缩包
docker export 容器_id > cenos6.tar
#导入镜像压缩包为新镜像
cat centos.tar | docker import - centos6_newname
#导出一个镜像为压缩包
docker image save nginx > nginx.tar
#导入压缩包为一个镜像
docker image load < nginx.tar
3、常用命令语法详解
https://blog.csdn.net/ljlfather/article/details/105532305
五、镜像存储核心技术
镜像怎么高效存储?
- 引入联合文件系统(UnionFS),将镜像多层文件联合挂载到容器文件系统。
1、联合文件系统UnioFS
- 一个典型的场景如下所示,一个镜像文件里面,里面分了多层,最下面的是基础镜像,这个基础镜像不包括内核文件,执行的时候他会直接调用宿主机的内核,因此他的空间并不大。在基础镜像上面,又分了很多层,每一层代表在dockerfile里面执行的一行命令。这整个镜像文件都是只读的。每个容器通过镜像创建自己的容器层,而容器层是可以读写的,修改的内容他们会保存在自己的目录下面。因此每个容器对自己的修改 不会影响到其他容器。
容器层读写: - 提供一个独立运行环境。
- 同一个镜像启动的不同容器相互隔离。
- 修改一个容器不会影响其他容器。
2、写时复制
了解联合文件系统,知道镜像只读,类似于共享形式让多个文件使用,如果修改1镜像里的文件,那该怎么办呢?
- 引入写时复制(copy-on-write),需要修改文件操作时,会先从基础镜像把要修改的文件复制到自己文件系统(容器中),然后让其在自己容器中修改。
- 修改过后并不影响基础镜像或者其他基于基础镜像启动容器。
- 写时复制是通过驱动Storage Driver: overlay2实现,默认驱动overlay2性能最好。
三层说明: - merged #容器挂载层
- upperdir #容器层
- lowerdir #镜像层
【overlay工作原理】
我们通过镜像创建的容器包括了三层
- 最下面的是一个只读的镜像层,第二层是容器层,在他上面最上面的容器挂载层。
- 最上层显示的是我们在容器上直接看见的内容,他通过UnionFS,或者说类似软连接的方式,文件的路径指向了容器层或者是镜像层。
当我们尝试读取,修改或者创建一个新的文件时
- 我们总是从上到下进行搜索,如果在容器层找到了,那么就直接打开。
- 如果容器层没有,那就从镜像层打开。
- 如果是一个新建的文档,那么就从镜像层拷贝到容器层,再打开操作。
读、写、删除:先查容器层——》镜像层——》结束
3、三层查看
#查看启动ID
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8733ed144ac nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp web2
928f069f0180 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp web1
#查看web1存储模块
[root@localhost ~]# docker inspect f8733ed144ac |grep "overlay2"
"Driver": "overlay2",
"LowerDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff:/var/lib/docker/overlay2/d1495e59d7fde7382ba3a1eb2c388988be217d4ed3da62613c0b9f7a1025e740/diff:/var/lib/docker/overlay2/df3fb02cdb70a2b9b01af02b46829113d2b4ecba176535ad7d6883ece429cdac/diff:/var/lib/docker/overlay2/4897b0c4c60dd1ad2dbc431c6953c7641a9963c6386d7e75b38fac099613b0c7/diff:/var/lib/docker/overlay2/b6eecaa8517e940b9336d5204a56f5d5c8d4b626eee7798cd3fb85a126e94329/diff:/var/lib/docker/overlay2/6221fbd6852b12077fcf556e9b12ac69213c55002608a5ded6d0497884847132/diff:/var/lib/docker/overlay2/2e366ccc8ea25e13a9bbcf685c70e83c90ed2afc49089091a7a9bf08608b71fe/diff",
"MergedDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/merged",
"UpperDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff",
"WorkDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/work"
"Name": "overlay2"
#查看LowerDir(镜像层),
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff
dev etc
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff/etc/
hostname hosts mtab resolv.conf
容器首先会先挂载宿主机三个文件
- hostname
- hosts
- resolv.conf
#容器层创建一个文件是否是存储1在对应的“UpperDir”层
[root@localhost ~]# docker ps|grep web2
f8733ed144ac nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 80/tcp web2
[root@localhost ~]# docker inspect web2 |grep "overlay2"
"Driver": "overlay2",
"LowerDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff:/var/lib/docker/overlay2/d1495e59d7fde7382ba3a1eb2c388988be217d4ed3da62613c0b9f7a1025e740/diff:/var/lib/docker/overlay2/df3fb02cdb70a2b9b01af02b46829113d2b4ecba176535ad7d6883ece429cdac/diff:/var/lib/docker/overlay2/4897b0c4c60dd1ad2dbc431c6953c7641a9963c6386d7e75b38fac099613b0c7/diff:/var/lib/docker/overlay2/b6eecaa8517e940b9336d5204a56f5d5c8d4b626eee7798cd3fb85a126e94329/diff:/var/lib/docker/overlay2/6221fbd6852b12077fcf556e9b12ac69213c55002608a5ded6d0497884847132/diff:/var/lib/docker/overlay2/2e366ccc8ea25e13a9bbcf685c70e83c90ed2afc49089091a7a9bf08608b71fe/diff",
"MergedDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/merged",
"UpperDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff",
"WorkDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/work"
"Name": "overlay2"
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff/
etc root run var
[root@localhost ~]# docker exec -it web2 /bin/bash
root@f8733ed144ac:/# touch a
root@f8733ed144ac:/# exit
exit
#确认容器中修改文件是存储在容器层
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff/
a etc root run var
4、优化建议
- 追求磁盘读写IO比较高,使用ssd固态硬盘,放在 /var/lib/docker/overlay2此位置。
- 使用卷作为频繁读写的工作目录,绕过存储驱动,减少抽象开销。
- 绕过驱动是指将容器读写数据持久化到宿主机上
- 持久化是指通过数据卷实现
- 绕过驱动是指将容器读写数据持久化到宿主机上