文章目录
作者: 良霄
1、docker简介
官网: https://www.docker.com/
什么是docker
Docker时Docker.Lnc公司开源的一个基于LXC(linux容器)技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。
集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
容器和镜像的区别
docker的整个生命周期有三部分组成:镜像(image)+ 容器(container)+ 仓库(repository)。
-
docker的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
-
docker镜像实际上是由一层一层的系统文件组成,这种层级的文件系统被称为UnionFS( Union file system 统一文件系统),镜像可以基于dockerfile构建,dockerfile是一个描述文件,里面包含了若干条密令,每条命令都会对基础文件系统创建新的层次结构。
-
docker利用容器来运行应用:docker容器是由docker镜像创建的运行实例。docker容器类似虚拟机,可以执行包含启动,停止,删除等。
-
每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的linux环境(包含root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
-
仓库类似于maven仓库,里面有很多官方或者第三方上传的镜像供我们使用,仓库的坐标都是 镜像名称:版本
2、docker安装
注意:docker需要root用户执行
官方帮助文档:https://docs.docker.com/engine/install/
docker分为在线安装和离线安装这里演示在线安装
在线安装
#1. 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2. 安装需要的安装包
yum install -y yum-utils
#3. 设置镜像仓库 国外镜像过慢,这里设置的是阿里的镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4. 安装docker相关的 docker-ce是社区版 ee是企业版
# 安装最新的版本
yum install docker-ce docker-ce-cli containerd.io
# 安装指定版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 查看所有版本
yum list docker-ce --showduplicates | sort -r
# 例如安装18.09.9版本
yum install -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io
#5. 启动docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world
# 显示以下信息表示成功
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
#8. 查看已经下载的镜像
docker images
卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源 var/lib/docker 是docker的默认工作路径!
rm -rf /var/lib/docker
docerk rund基本流程
3、从 docker hub下载安装镜像
我们这里以Tomcat为例
- 查询我们需要的镜像
docker search tomcat
如果上面没有我们需要下载的镜像我们可以到 https://hub.docker.com/ 上找到我们需要的版本指定下载
-
拉取镜像
docker pull tomcat:8.5.43
-
查看刚下载的镜像
docker images
-
启动tomcat
# -d 后台方式运行 # -it 交互式运行 # --name 指定容器名字 # -p 指定端口映射 宿主机端口:容器端口 因为每个容器相互独立,所以各个容器的端口可以重复 # 注意:映射的容器内的端口容器需要暴露出来 # docker run -d --name <自定义容器名> -p <宿主机端口>:<容器端口> <镜像名称>:<镜像版本> # 如果我们第一启动就以挂载的方式启动,会报配置文件找不到的错,所以需要先正常启动容器然后在进行后续操作 docker run -d --name tomcat -p 8080:8080 tomcat:8.5.43 # 查看tomcat是否启动 docker ps
-
进入进行然后把conf、logs和webapps目录copy出来
# 找到container_id docker ps # 进入镜像 -it 交互式运行 docker exec -it ff56c7550098 /bin/bash
进入容器成功
退出容器
命令:exit 快捷健: windows: ctrl + q + p mac:control + q + p
-
以挂载方式启动
# 复制容器中的文件到宿主机 # 命令 docker cp 容器id:容器中文件/目录路径 宿主机地址 # 这复制的是Tomcat的conf、webapps和logs docker cp ff56c7550098:/usr/local/tomcat/conf /home/gpos/docker/chilTomcat/ docker cp ff56c7550098:/usr/local/tomcat/webapps /home/gpos/docker/chilTomcat/ docker cp ff56c7550098:/usr/local/tomcat/logs /home/gpos/docker/chilTomcat/ # 如果我们复制完文件后直接启动会报错 是因为我们启动是通过 --name指定了容器的名字,该名字全局唯一 # docker: Error response from daemon: Conflict. The container name "/tomcat" is already in use by container "ff56c7550098cdb05590479116f246166235f6096c4e8c4e0325d1569b204e62". You have to remove (or rename) that container to be able to reuse that name. # 以为目前我还没有对容器进行操作 直接删除现在的容器 从新运行即可, 如果期间添加了配置等 可以先提交容器成为新的镜像 # 这里我们演示直接删除的容器, 提交容器后续会提到 # 注意 删除容器前要先停止容器 # 停止容器 docker stop 容器id docker stop ff56c7550098 # 删除容器 docker rm ff56c7550098 # 确认是否删除 docker ps # 查看对应的容器是否还在 # 以挂载方式启动 # -v 宿主机文件/目录地:址容器中文件/目录地址 可以挂载多个文件目录 # 当我们挂载成功以后,修改宿主机上面文件容器中的文件会同步修改 docker run -d --name tomcat -p 8080:8080 \ -v /home/gpos/docker/chilTomcat/conf:/usr/local/tomcat/conf \ -v /home/gpos/docker/chilTomcat/logs:/usr/local/tomcat/logs \ -v /home/gpos/docker/chilTomcat/webapps:/usr/local/tomcat/webapps \ tomcat:8.5.43 # 启动成功 docker ps # 查看对应的容器是否成功
验证
-
修改配置查看是否挂载成功
在宿主机的挂载目录webapps中创建 test目录,查看容器是否同步到, 反之亦然
# 宿主机创建test目录 mkdir test
在容器中查看
# 进入容器 docker exec -it 9273616f295c /bin/bash
同步成功
-
在宿主机修改文件重启tomcat
# 修改tomcat主页 # 进入webapps/WEB-INF下修改index.jsp # 重启容器 如果修改的是静态文件可以不用重启 docker restart 9273616f295c
访问查看是否生效
修改生效 ,挂载成功
4、镜像制作
建议用第二种方式, 第一种是一次性的
4.1、通过官方镜像制作(不建议)
注意:通过此方式制作镜像时,修改配置文件需要启动容器进入容器内部进行修改,如果修改挂载出来的文件,在制作镜像时修改的内容不会加载到新的镜像里!!!!
-
制作镜像
进入容器创建测试文件夹
# docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本TAG]
docker commit -a="chilx" -m="init my tomcat" 9273616f295c mytomcat:v1
生成成功
- 简单的运行查看修改是否生效
# -it 交互式运行 直接进入容器
docker run -it --name tomcat1 -p 8090:8080 mytomcat:v1 /bin/bash
测试目录存在说明镜像制作成功
4.2、通过Dockefiler制作(建议)
这里也是以tomcat为例
-
下载tomcat到服务器
-
解压并修改配置(这里我修改首页)
# 解压 tar -zxvf apache-tomcat-8.5.57.tar.gz # 修改index.jsp
-
编写Dockerfile(文件名就叫Dockerfile不可修改)
# 基础镜像 从哪里开始 FROM openjdk:8u252-jdk #作者 MAINTAINER xxxx <xxx@xxxx.com> #添加文件到镜像 宿主机位置 镜像中位置 ADD apache-tomcat-8.5.57/ /usr/local/tomcat/ #声明一个挂载点,容器内此路径会对应宿主机的某个文件夹 VOLUME /usr/local/tomcat/webapps VOLUME /usr/local/tomcat/conf VOLUME /usr/local/tomcat/logs #暴露8080端口 EXPOSE 8080 RUN cd /usr/local/tomcat/bin #启动容器时的进程 ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
-
构建镜像
# 命令 docker build -t <镜像名>:<版本> . # 注意不要忘记最后的点, 在Dockerfile的目录执行 docker build -t mytomcat2:v1 .
-
检查验证
# 查看镜像 docker images
# 执行镜像 docker run -d --name mytomcat2 -p 8091:8080 mytomcat2:v1
验证
我们修改的内容已经在新的镜像中了
5、镜像导出和导出
- 导出镜像
# 导出命令 docker save [options] images [images...]
# 导出我们制作的mytomcat2
docker save > mytomcat2.tar mytomcat2:v1
# 删除旧的镜像
docker rmi 948e5a83f6b2
mytomcat2已经被删除
- 导入镜像
# 导入命令 docker load [options]
# 导入刚导出的镜像(导入前记得删除以前的镜像)
docker load < mytomcat2.tar
- 查看验证
docker images
导入成功
启动
docker run -d --name importtomcat -p 8092:8080 mytomcat2:v1
验证
导入成功
6、基本命令
attach Attach local standard input, output, and error streams 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 between a container and the local filesystem #拷贝文件
create Create a new container #创建一个新的容器
diff Inspect changes to files or directories on a container's filesystem #查看docker容器的变化
events Get real time events from the server # 从服务获取容器实时时间
exec Run a command in a running container # 在运行中的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
history Show the history of an image # 展示一个镜像形成历史
images List images #列出系统当前的镜像
import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
info Display system-wide information # 显示全系统信息
inspect Return low-level information on Docker objects #查看容器详细信息
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]
login Log in to a Docker registry #
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes