你不知道的Docker
一、前言docker是一种容器技术,k8s是一种容器编排技术,当然docker也支持容器编排,但是由于名声干不过k8s所以业界在容器编排大多用的就是k8s(简单比较下)二、docker基础知识docker基本组成镜像从某种角度可以理解为软件安装包,就好比没有jar,war包如何启动spring服务?容器通过docker run + 镜像ID 启动的服务称之为容器,容器与容器之间互相不影响,相互隔离
一、前言
docker是一种容器技术,k8s是一种容器编排技术,当然docker也支持容器编排,但是由于名声干不过k8s所以业界在容器编排大多用的就是k8s(简单比较下)
二、docker基础知识
docker基本组成
镜像
- 从某种角度可以理解为软件安装包,就好比没有jar,war包如何启动spring服务?
容器
- 通过docker run + 镜像ID 启动的服务称之为容器,容器与容器之间互相不影响,相互隔离
仓库
- 同比maven镜像公共仓库,此仓库有丰富的资源镜像供大家下载:https://hub.docker.com/
docker镜像加速器
- 推荐使用阿里云的镜像加速器,由于有些镜像资源会从国外下载,速度会非常慢,使用阿里云国内镜像加速器可以解决这个困扰
#1. 登录阿里云找到容器服务
#2. 找到镜像加速器,按照指导的操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ttqeishm.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker常用命令
安装docker
#安装docker
yum install docker
#启动docker服务
systemctl start docker
#查看docker服务
systemctl status docker
docker操作镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
docker操作容器命令
docker run 镜像id #新建容器并启动
docker ps #列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
docker start 容器id #启动容器
docker restart容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
docker logs -ft 容器id #跟着日志
docker inspect 容器id #查看镜像元数据信息
docker exec -it 容器id #进入容器当中
docker run的启动流程
- 首先执行docker run之后,会根据指定的image优先从本地找该镜像资源
- 如果本地没找到,就会去docker hub镜像仓库上去找,如果本地有就直接用本地镜像资源
- 若docker hub镜像仓库上也没找到就会报错,提示资源不存在
- 若docker hub镜像仓库上找到资源,就会先下载该资源到本地,最后启动镜像
docker底层工作原理
- 首先要使用docker,必须开启docker服务,开启docker服务就意味着开启docker守护进程
- docker run启动多个容器服务,每个容器互相隔离,但是容器要与宿主机Linux联系必须通过docker守护进程
- Linux系统 <----> docker守护进程 <-----> 容器服务
docker pull镜像加载原理
- UnionFs (联合文件系统)
Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像 - 加载原理
1.docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS,每一层级都包含对应的文件系统,通过docker pull下载镜像其实就是加载每一层级的文件系统
2.若下载其他镜像出现已存在的字样表示docker底层支持共享文件系统概念,有的就不下载,docker会直接拿来用
3.docker inspect image
可以查看该镜像依赖的联合文件系统,如图Layers显示的就是文件的hash值
容器数据共享
- 容器数据卷是将容器与宿主机之间实现目录or文件映射关系,从而实现docker容器与操作系统之间数据共享
#-v /data/webapps:/usr/local/tomcat/webapps 宿主机目录与容器目录实现映射关系
# -p表示Linux外部端口与容器内部端口实现映射关系
docker run -d -p 18889:8080 --name test-tomcat -v /data/webapps:/usr/local/tomcat/webapps 7104b0bd2157
Dockerfile
- docker支持的脚本文件,通过docker支持的指令来生成镜像
Dockerfile基本结构
Dockerfile 一般分为:基础镜像、镜像元信息、镜像操作指令和容器启动时执行指令,# 为 Dockerfile 中的注释
dockerfile文件说明
Docker 从上到下的顺序运行Dockerfile 的指令,每一个指令都以 step 为步骤。而且文件的命名也必须为 DockerfileDockerfile常用命令
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
#FROM是指定基础镜像,必须为第一个命令,格式:
FROM <image>:<tag>
#示例:
FROM mysql:5.6
#RUN 指令是用来执行命令行命令的
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
#COPY复制文件
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
COPY package.json /usr/src/app/
#ADD更高级的赋值文件
#ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及xz 的情况下, ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
#CMD容器启动命令
> CMD 指令的格式和 RUN 相似,也是两种格式:
>
> - shell 格式: CMD <命令>
> - exec 格式: CMD ["可执行文件", "参数1", "参数2"...]
> - 参数列表格式: CMD ["参数1", "参数2"...] 。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
#ENV设置环境变量
ENV VERSION=1.0 DEBUG=NAME="Happy Feet"
#VOLUME定义匿名卷
- VOLUME ["<路径1>", "<路径2>"...]
#EXPOSE端口声明
- EXPOSE <端口1> [<端口2>...]
#EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口。要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。 -p ,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
#WORKDIR指定工作目录
- WORKDIR <工作目录路径>
三、docker高级知识
docker-compose
- Compose是用于定义和运行多容器Docker应用程序的工具
使用Compose基本上是一个三步过程:
- 使用定义您的应用环境,
Dockerfile
以便可以在任何地方复制。 - 定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 - Run
docker-compose up
and Compose启动并运行您的整个应用程序。
安装docker compose
#1. 运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#2. 将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
卸载docker compose
sudo rm /usr/local/bin/docker-compose
docker compose yml语法配置详解
地址: https://docs.docker.com/compose/compose-file/
docker compose常用命令
1.docker-compose up
用于部署一个 Compose 应用。默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件。当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。
2.docker-compose stop
停止 Compose 应用相关的所有容器,但不会删除它们。被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。
3.docker-compose rm
用于删除已停止的 Compose 应用。它会删除容器和网络,但是不会删除卷和镜像。
4.docker-compose restart
重启已停止的 Compose 应用。如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
5.docker-compose ps
用于列出 Compose 应用中的各个容器,输出内容包括当前状态、容器运行的命令以及网络端口。
6.docker-compose down
停止并删除运行中的 Compose 应用。
如何搭建个人的镜像仓库
- 阿里云镜像仓库服务文档:https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.549.51127c9ef9NFMo
- 阿里云镜像服务控制台:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
1. 登录阿里云Docker Registry
$ sudo docker login --username=username registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/kaleidoscopic/henry:[镜像版本号]
3. 将镜像推送到Registry
$ sudo docker login --username=henry丶肖 registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kaleidoscopic/henry:[镜像版本号]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/kaleidoscopic/henry:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用"docker images"命令找到镜像,将该镜像名称中的域名部分变更为Registry专有网络地址。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
6.拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kaleidoscopic/henry:1.1.1
个人总结来源于docker官网及狂神说java的docker讲解:https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=15595339542807380388
更多推荐
所有评论(0)