Docker基础
Docker基础
一、基础概念
官方
Docker 三要素
镜像(image)
就是一个只读的模版,镜像可以用来创建Dcoker容器,一个镜像可以创建很多个容器
容器(container)
- 独立运行的一个或一组应用.容器是用镜像创建的运行实例
- 他可以被启动、开始、停止、删除、每个容器都是相互隔离的、保证安全的平台.
- 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序.容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的.
仓库(Repository)
- 是集中存放镜像文件的场所
- 仓库(Repository)和仓库注册服务器(Registry)是有区别的.仓库注册服务器上往往存放着多个仓库,每个仓库中又包含来多个镜像文件.每个镜像又不同的标签(tag)
- 仓库分为公开库(public)和私有仓库(private)两种形式
- 最大的公开仓库是 docker hub(https://hub.docker.com)
- 存放来数量庞大的镜像仅供用户下载.国内的公开仓库包括阿里云,网易云等
Docker与虚拟机(VM)
docker容器 | 虚拟机 | |
---|---|---|
操作系统 | 与宿主机共享os | 宿主机os上运行虚拟机 |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk,vdi等) |
运行性能 | 几乎无额外性能损耗 | 操作系统额外的CPU,内存消耗大 |
移植性 | 轻便,灵活,试应与Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,10s以上 |
二、Docker 常用命令
显示 Docker 版本信息
docker version
显示 Docker 系统信息,包括镜像和容器数
docker info
帮助
docker --help
镜像命令
docker images 镜像
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8 02d718ca90fd 9 months ago 530MB
tomcat latest 891fcd9c5b3a 9 months ago 647MB
tomcat latest 891fcd9c5b3a 9 months ago 647MB
nginx latest f35646e83998 9 months ago 133MB
mysql 5.7 42cdba9f1b08 9 months ago 448MB
centos latest 0d120b6ccaa8 11 months ago 215MB
java 8 d23bdf5b1b1b 4 years ago 643MB
maluuba/tomcat7-java8 latest 98a0fcf6d133 4 years ago 662MB
- REPOSITORY 表示镜像的仓库源
- TAG 镜像标签
- IMAGE ID 镜像ID
- CRAEATE ID 镜像创建时间
- SIZE: 镜像大小
- 同一个仓库源可以又多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像,如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker将默认使用 ubuntu:latest 镜像
- options说明:
- -a:列出本地所有的镜像(含中间映像层)
- -q:只显示镜像ID
- --digests:显示镜像的摘要信息
- --no-trunc:显示完整的镜像信息
docker search 查询
- docker [options] 镜像名字
- options :
- --no-trunc 显示完整的镜像描述
- -s: 列出收藏数不小于指定值的镜像
- --automated: 只列出automated build的类型的镜像:
[root@centos-linux ~]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2851 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 83 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 55 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 36 [OK]
kubeguide/tomcat-app Tomcat image for Chapter 1 29
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 17 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 13 [OK]
arm32v7/tomcat Apache Tomcat is an open source implementati… 10
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 6 [OK]
maluuba/tomcat7-java8 Tomcat7 with java8. 6
unidata/tomcat-docker Security-hardened Tomcat Docker container. 4 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 2
arm64v8/tomcat Apache Tomcat is an open source implementati… 2
jelastic/tomcat An image of the Tomcat Java application serv… 2
99taxis/tomcat7 Tomcat7 1 [OK]
oobsri/tomcat8 Testing CI Jobs with different names. 1
camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK]
chenyufeng/tomcat-centos tomcat基于centos6的镜像 1 [OK]
ppc64le/tomcat Apache Tomcat is an open source implementati… 1
cfje/tomcat-resource Tomcat Concourse Resource 1
softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK]
picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 0 [OK]
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementati… 0
docker pull 拉取镜像
docker pull tomcat
[root@localhost docker]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
627b765e08d1: Pull complete
c040670e5e55: Pull complete
073a180f4992: Pull complete
bf76209566d0: Pull complete
f10db7ba7580: Pull complete
5b2f970878fa: Pull complete
ed434bfebf18: Pull complete
f6c437110aa9: Pull complete
a772951f83db: Pull complete
752225c3768e: Pull complete
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost docker]#
docker rmi 删除镜像
- 删除一个 docker rmi -f 镜像ID
- 删除多个 docker rmi -f 镜像1:TAG 镜像名2:TAG
- 删除全部 docker rmi -f $(docker images -qa)
- docker rmi -f hello-world
[root@localhost docker]# docker rmi -f tomcat
Untagged: tomcat:latest
Untagged: tomcat@sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Deleted: sha256:46cfbf1293b176161813fa05bb8f7e82df1ec7def5c226c48bc48a60ed305ac7
Deleted: sha256:6748c687a38bae8ee5179c1b7c3fc05347dab445a5322f30e62c80348997d99c
Deleted: sha256:4e78f4eefb564a3492c5840bfcf17a0bed07fda1e59127c66058dd7553ed7f9b
Deleted: sha256:99b6cc44dbf7b0b4809ede178ae7fb27fef1401c8b2415be0dc18b6153ff233f
Deleted: sha256:046e7218b905a3de840f00a2aa7081fc53ace4ffba9661d471d59bfdcfa5b4c1
Deleted: sha256:3095bb61fd62bf2c2fd6849289c6043e8866bf104ca0959be3fc3da5bab0be1e
Deleted: sha256:f33d6ed931ff64c63168af00c7544d148d01fda66831246572ff2bfcacbcf2d6
Deleted: sha256:017b9704876de2443b332b1dfec580d365184b514eb0af43f1d59637e77af9bb
Deleted: sha256:98fc59c935e697d6375f05f4fa29d0e1ef7e8ece61aed109056926983ada0ef4
Deleted: sha256:c21ff68b02e7caf277f5d356e8b323a95e8d3969dd1ab0d9f60e7c8b4a01c874
Deleted: sha256:afa3e488a0ee76983343f8aa759e4b7b898db65b715eb90abc81c181388374e3
[root@localhost docker]#
容器命令
docker run -it 新建并启动容器
- docker run -it
- options
- --name 容器新名字 为容器指定一个名称
- -d 后台运行容器 并返回容器ID 也即启动守护式容器
- -i 以交互式模式运行容器,通常与-t同时使用:
- -t: 为容器重新分配一个伪输入终端,通常与 -i同时使用:
- -P:随机端口映射:
- -p:指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- contaninerPor
后台启动 tomcat8 容器 内部端口8080 外部端口9990
root@localhost docker]# docker run -id -p 9990:8080 tomcat:8
9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0
非后台启动 tomcat8 容器 内部端口8080 外部端口9990
[root@localhost docker]# docker run -it -p 9990:8080 tomcat:8
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
02-Aug-2021 07:08:48.309 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/8.5.69
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Jun 30 2021 18:00:00 UTC
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.69.0
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-1127.19.1.el7.x86_64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/openjdk-8/jre
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_302-b08
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
注意:直接退出 Ctrl+ c 进程结束。 Ctrl+ P+ Q 进程后台运行,退出命令行。
docker ps 进程
- docker ps 进程
- options
- -a 列出当前所有正在运行的容器+历史上运行过的
- -i 显示最近创建的容器
- -n 显示最近N个创建的容器 docker ps -n 2
- -q 静默模式,只显示容器编号
- --no-trunc 不截断输出.
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d340293e2c2 tomcat:8 "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:9990->8080/tcp sad_kepler
docker exec 在运行的容器中执行命令
- docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- OPTIONS说明:
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
[root@localhost docker]# docker exec -it determined_feistel /bin/sh
# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
# pwd
/usr/local/tomcat
docker attach :连接到正在运行中的容器。
- docker attach [OPTIONS] CONTAINER
[root@localhost docker]# docker attach quirky_turing
docker inspect 查看容器内部细节
[root@localhost docker]# docker inspect 9d340293e2c2
[
{
"Id": "9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0",
"Created": "2021-08-02T06:55:06.74894522Z",
"Path": "catalina.sh",
"Args": [
"run"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 112128,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-02T06:55:07.22290482Z",
"FinishedAt": "0001-01-01T00:00:00Z"
…………省略
docker restart 重启
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dff9971e52c7 tomcat:8 "catalina.sh run" 9 minutes ago Up 9 minutes 0.0.0.0:9990->8080/tcp loving_haslett
[root@localhost docker]# docker restart dff9971e52c7
dff9971e52c7
[root@localhost docker]#
docker stop 停止
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker kill 强制停止
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker start 启动
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker rm 删除
[root@localhost docker]# docker rm dff9971e52c7
dff9971e52c7
docker rm -f 强制删除
[root@localhost docker]# docker rm -f dff9971e52c7
dff9971e52c7
docker rm -f $(docker ps -a -q) 删除多个容器
[root@localhost docker]# docker rm -f $(docker ps -a -q)
54f5b6f8e1fc
1bbf08d5704c
9d340293e2c2
d9454af4daee
f77680c0be59
fa682e10ef7d
ecd5673894d5
f7d1d0f35211
docker ps -a -q | xargs docker rm 删除多个容器
[root@localhost docker]# docker ps -a -q | xargs docker rm
d6435b9cc59c
三、UnionFS(联合文件系统):
Union 文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟机文件系统下
官网文档
四、Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是弓I导加载kernel, Linux刚启动时会加载bootfs文件系统,在 Docker镜像的最底层是bootfsc这一层与我们典型的Linux/Unix系统是一样的,包含boot加我器和内核。当boot加我完成之后整个内核 就都在内存中了,此时内存的使用权己由bootfs转交给内核,此时系统也会卸我bootfs。
rootfs (root file system),在bootfs之包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件° rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等。
五、Docker 分层镜像
最大的一个好处就是-共享资源
比如:有多个镜像都从相同的base镜像构建而来,name宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
六、Docker 特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被陈作为"容器层",容器层之下的都叫“镜像层”。
七、Docker 容器数据卷
概念:
将运用与运行的环境大包形成的容器运行,运行可以伴随着容器,但那会使我们对数据的要求希望是持久化的容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit 生成新的镜像,数据不会做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了
为来能保存数据在docker 中我们使用卷
能干嘛:
容器的持久化
容器间继承+共享数据
特点:
- 数据卷可以在容器之间共享数据
- 卷中更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用为止
命令
docker run -it 镜像ID
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer:ro 只读
容器内添加
- 直接命令添加
- Dockerfile添加
Dockerfile体系机构
- FROM:
- 基础镜像,当前新镜像是基于哪个镜像的
- MAINTAINER
- 镜像维护者的姓名和邮箱
- RUN
- 容器构建时需要运行的命令
- WORKDIR
- 指定在创建容器后,终端默认登录进来工作目录,一个落脚点
- ENV
- 用来构建镜像过程中设置环境变量
- ADD
- 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理URL和解压tar压缩包
- COPY
- 类型ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- VOLUME
- 容器数据卷,用户数据保存和持久化工作
- CMD
- 指定一个容器启动时要运行的命令
- Dockerfile 中可以有多个 CMD 命令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
- ENTRYPOINT
- 指定一个容器启动时需要运行的命令
- ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
- ONBUILD
- 当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子镜像继承后父镜像的 onbuild 会被触发
Dockerfile 文件
# test
FROM centos
VOLUME ["/www/docker/data","/www/docker/data"]
CMD echo "finished,-----success1"
CMD /bin/bash
打包镜像
- docker build -t ming/centos .
- Docker 挂载主机目录Docker访问出现cannot open directory .:Permission denied
- 解决办法:在挂载目录后多加一个--privileged=true参数即可
- DockerFile添加的数据卷需要执行 docker inspect ID 容器细节中查看 宿主机数据卷目录
- docker build -f /www/docker/DockerFile -t ming/centos .(在当前目录下 无需指定 Dockerfile 路径)
[root@localhost docker]# docker build -t ming/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["/www/docker/data","/www/docker/data"]
---> Running in 13d0ab91d6c7
Removing intermediate container 13d0ab91d6c7
---> 129928688111
Step 3/4 : CMD echo "finished,-----success1"
---> Running in 33f38d495fc5
Removing intermediate container 33f38d495fc5
---> 3f3a98d9b049
Step 4/4 : CMD /bin/bash
---> Running in d24c5daed8a7
Removing intermediate container d24c5daed8a7
---> 0a6187601a12
Successfully built 0a6187601a12
Successfully tagged ming/centos:latest
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ming/centos latest 0a6187601a12 27 seconds ago 209MB
centos latest 300e315adb2f 7 months ago 209MB
启动容器 www 目录 Dockerfile 中挂载的路径
[root@localhost docker]# docker run -it ming/centos
[root@5e7234752a54 /]# docker ps
bash: docker: command not found
[root@5e7234752a54 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var www
[root@5e7234752a54 /]# cd www/
[root@5e7234752a54 www]# pwd
八、Docker常用安装
总体步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止镜像
- 移除镜像
九、常见问题
一、镜像文件无法删除
进入如下目录,找到对应的镜像 ID 进行删除即可。
cd /var/lib/docker/image/overlay2/imagedb/content/sha256
二、Docker容器端口映射后突然无法连接
1、关闭防火墙服务
systemctl stop firewalld.service
2、防火墙端口放行
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
3、没有启用IP_FORWARD, 0就是未启用
[root@localhost docker]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
解决办法一条命令
echo 'net.ipv4.ip_forward = 1' >> /usr/lib/sysctl.d/50-default.conf
重新加载配置
sysctl -p /usr/lib/sysctl.d/50-default.conf
三、Docker 挂载主机目录Docker访问出现cannot open directory .:Permission denied
在挂载目录后多加一个--privileged=true参数即可