Docker
Docker的名词解释
镜像(image):
- Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的);
容器(container)
- Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的;
- 启动,停止,删除,基本命令!
仓库(repository)
- 存放镜像的地方;
- Docker Hub(默认是国外的);
- 阿里云都有容器服务(配置镜像加速!);
安装Docker
https://docs.docker.com/engine/install/centos/
环境准备
1:需要会一点Linux命令
2:Centos 7
3:使用Xshell 远程连接服务器进行操作
环境查看
[root@VM-4-6-centos ~]# uname -r
3.10.0-1160.49.1.el7.x86_64
1.卸载旧版本docker
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 \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yun软件包索引
yum makecache fast
4.安装docker docker-ce社区 ee企业版
yum install docker-ce docker-ce-cli containerd.io
5.启动docker
systemctl start docker
6.使用docker version判断是否安装成功
docker run hello-world
此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。
7.查看一下下载的docker镜像
卸载docker
1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2.删除资源
rm -rf /var/lib/docker
Docker镜像加速
这里以腾讯云为例(宝塔面板傻瓜式安装)
Docker常用命令
docker version #显示docker
docker info #显示docker的系统信息,包括镜像和容器的数量
docker help #帮助命令
镜像命令
docker images 查看所有本地所有镜像
#解释
Repository 镜像的仓库源
Tag 镜像的标签版本
Image ID 镜像ID
Created 镜像创建时间
Size 镜像大小
docker search mysql搜索镜像
docker pull 下载镜像
docker pull mysql
Using default tag: latest #不写tag,默认会下载最新的tag镜像
#指定5.7版本mysql
docker pull mysql:5.7 #这个版本一定是docker hub上有的版本才可以
docker rmi删除镜像
docker images #查看镜像
docker rmi -f IMAGE ID #删除指定镜像,rmi表示remove image(删除镜像) -f表示force强制删除
docker rmi -f IMAGE ID IMAGE ID IMAGE ID #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部镜像 -aq查出所有镜像id
容器命令
新建容器并启动
#-p第一个为对外暴露端口,第二个为容器内端口
docker run --name mynginx -p 80:80 -d nginx
查看容器
docker ps 列出当前正在运行的容器
docker ps -a 列出当前正在运行的容器+未运作的容器
查看容器日志
docker logs 容器id 查看容器日志
docker logs -f 容器id 可持续查看容器日志
删除容器
docker rm 容器id #删除指定容器,不能删除正在运行的容器,如果要强制删除 rm-f
docker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker stop $(docker ps -aq) #停止当前运行所有容器
docker kill 容器id #强制停止当前容器
进入容器
#方式一,以下是等价的
docker exec -it 容器id /bin/bash
docker exec -it 容器名称 /bin/bash
#不行的话吧/bash换成/sh
docker exec -it weather /bin/sh
#方式二
docker attach 容器id
#方式一进入容器后开启一个行的终端,可以在里面操作(常用) 退出容器终端时,不会导致容器的停止。
#方式二进入容器正在执行的终端,不会启动新的进程 退出容器时,会导致容器的停止。
退出容器
exit #容器停止并退出
Ctrl+P+Q #容器不停止,并且退出
查看容器中进程信息
#docker top 容器id
[root@VM-4-6-centos ~]# docker top da9772ffcacb
查看获取容器/镜像的元数据(不常用)
#docker inspect 容器id
Docker数据卷
例如需要修改容器内配置文件,每次需要进入容器,十分的麻烦.
可以通过数据卷,将文件挂载到我们的宿主主机,直接修改文件,即可实现数据共享
创建数据卷
docker volume create volumename
查看数据卷详细信息 Mountpoint为数据在本机存储的位置,如果磁盘存储空间不足可修改此位置
docker volume inspect volumename
列出所有数据卷
docker volume ls
删除数据卷
docker volume rm volumename
#删除不再使用的 docker volume 对象
docker volume prune
如果容器运行时,volume不存在,会自动创建出来
#创建容器并挂载数据卷到容器内html目录
docker run --name mn -p 3344:80 -v html:/usr/share/nginx/html -d nginx
#查看html数据卷位置
docker volume inspect html
#进入该目录
cd /www/server/docker/volume/html/_data
#修改文件
vim index.html
修改了nginx的index.html,可以发现已经容器内的修改已经生效了
小结
作业练习
1:docker安装nginx
#1:搜索镜像
docker search nginx
#2:下载镜像
docker pull nginx
#3:查看镜像
[root@VM-4-6-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 12766a6745ee 3 weeks ago 142MB
centos latest 5d0da3dc9764 7 months ago 231MB
-d 后台运行
--name给容器起名
-p linux端口:容器内部端口
[root@VM-4-6-centos ~]# docker run -d --name nginx01 -p 3344:80 nginx
#curl localhost:3344 需要在安全组放行次端口
进入容器
[root@VM-4-6-centos ~]# docker exec -it nginx01 /bin/bash
root@4b781c444756:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4b781c444756:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@4b781c444756:/# cd /etc/nginx
root@4b781c444756:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
2:docker安装Tomcat
#1:搜索镜像
docker search nginx
#2:下载镜像
docker pull nginx
#3:运行镜像
[root@VM-4-6-centos~]# docker run -d -p 3355(外部linux):8080(容器内部) --name tomcat01 tomcat:[tag] 不填tag默认是latest需要在安全组放行次端口
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
426bc2db09dd tomcat "catalina.sh run" Up 15 minutes 0.0.0.0:3355->8080/tcp,:::3355->8080/tcp tomcat01
4b781c444756 nginx "/docker-entrypoint.…" Up 44 minutes 0.0.0.0:3344->80/tcp,:::3344->80/tcp nginx01
#4:进入容器
#docker exec -it tomcat01 /bin/bash
发现问题:1:linux命令少了2:webapps里没有东西,阿里云镜像的问题,默认是最小的镜像,所有不必要的东西不会下载
#保证最小可运行环境
将webapps.dist文件复制到webapps里面,公网就可以访问到Tomcat了
# cp -r webapps.dist/* webapps
Docker可视化管理工具
-
portainer(先用这个)
-
Rancher(CI/CD再用)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
什么是portainer?
Docker图形化管理界面!提供一个类似swagger的后台给我们操作!
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:服务器IP:8088
http://121.4.32.107:8088 #服务器IP:8088 密码:我的名字拼音+2000415
进入页面,输入密码—>create user—>local
可以看到本地docker的一些数据~
Docker镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。应用可以直接打包docker镜像,就可以直接Run起来
如何得到镜像
- docker hub远程下载
- 朋友拷贝
- docker file 生成一个镜像
镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
分层理解
可以去下载一个镜像,观察下日志的下载输出,可以看到是一层层在下载
#docker image inspect redis:latest
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9",
"sha256:5c4e5adc71a82a96f02632433de31c998c5a9e2fccdcbaee780ae83158fac4fa",
"sha256:7d2b207c26790f693ab1942bbe26af8e2b6a14248969e542416155a912fec30d",
"sha256:2c7498eef94aef8c40d106f3e42f7da62b3eee8fd36012bf7379becc4cd639a2",
"sha256:4eaf0ea085df254fd5d2beba4e2c11db70a620dfa411a8ad44149e26428caee4"
]
},
提交镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
实战测试
#启动一个默认的Tomcat
#发现默认的Tomcat,webapps里没有文件,是因为官方镜像下载是默认没有文件的
#自己拷贝webapp.dist文件到webapps里 -r表示递归 cp表示复制 -r表示递归处理,将指定目录下的文件与子目录一并处理。
root@a3851a229905:/usr/local/tomcat# cp -r webapps.dist/* webapps
容器数据卷
什么是容器数据卷
将我们的应用,和环境打包成一个镜像!
数据?如果都在容器中,那么我们的容器删除,数据就会丢失!!需求:数据可以持久化
容器间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地----使用数据卷
匿名挂载和具名挂载
具名挂载的顾名思义就是有名字,这个名字是我们自己给取的
匿名挂载的意思就是不指定名字,让系统给他默认生成一个长长的字符串作为名字。
#匿名挂载
docker run -d -P --name nginx -v /etc/nginx nginx
#查看所有的volume情况
docker volume ls
#发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径
local 228aedc0f53e38ff6e0be5e38a90340290a0b785b281313e37754bab0e8db6a9
#具名挂载
docker run -d -P --name nginx02 -v juming-ngnix:/etc/nginx nginx
#docker volume ls
DRIVER VOLUME NAME
local 228aedc0f53e38ff6e0be5e38a90340290a0b785b281313e37754bab0e8db6a9
local ac5de819787d86c173ab95f1fa02b76b74299756ec3149ad26b0af39a653dff4
local juming-nginx
所有docker容器内的卷,没有指定目录都是在==/www/server/docker/volumes/juming-ngnix/_data’==下
#如何区别是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
方式一:直接使用命令来挂载 -v (具名挂载)
docker run -it -v 主机目录:容器内目录
#测试
[root@VM-4-6-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来后通过 docker inspect 容器id
初始DockerFile
方式二:DockerFile
Docker File就是用来构建docker镜像的文件!!命令脚本!!
通过这个脚本,可以镜像,镜像是一层一层的
#创建一个dockerfile文件,名字可以随机
#文件中的内容,大写
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
#里面的每个命令,就是镜像的一层
#启动自己写的容器
[root@VM-4-6-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bzovo/centos latest e7682a765cc5 5 minutes ago 231MB
[root@VM-4-6-centos docker-test-volume]# docker run -it e7682a765cc5 /bin/bash
DockerFile
Docker File就是用来构建docker镜像的文件!!命令脚本!!
构建步骤
-
创建编写一个dockerfile文件
-
docker build构建为一个镜像
-
docker run运行镜像
-
docker push 发布镜像(到DockerHub)
DockerFile介绍
Docker镜像逐渐成为企业交付的标准,必须要掌握、
DockerFile:构建文件,定义了一切步骤
DockerImages:通过dockerfile构建生成的镜像,最终发布和运行的产品
DockerContainer:容器就是镜像运行起来提供服务器
DockerFile指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容,类似COPY,会自动帮我们解压文件!!!
WORKDIR #镜像的工作目录,进入容器时,默认进入的目录
VOLUME #挂载的目录
EXPOST #暴露端口配置,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可追加命令
ONBUILD #当构建一个被继承的DockerFile这个时候就会运行ONBUILD的指令,触发指令
COPY #类似ADD,将我们宿主机文件拷贝到镜像中
格式: COPY <src> <dest>
详解:复制本地主机的 <src>下内容到镜像中的 <dest>,目标路径不存在时,会自动创建。
<src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)
ENV #构建的时候设置环境变量
实战测试
创建自己的Centos镜像
#1:编写DockerFile文件
FROM centos
MAINTAINER ziyun<572308036@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH #运行容器时,默认会进入工作目录,
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#2:通过文件构建镜像
#命令docker build -f dockerfile-centos -t mycentos:0.1 .
docker build -f dockerfile文件名 -t 镜像名:[tag]
Successfully built 36abcb2d3643
Successfully tagged mycentos:0.1
查看我们自己创建的Centos镜像
#docker run -it mycentos:0.1
[root@5ff1f9122f2d local]# pwd
/usr/local #可以看到进去容器的时候,默认就是/usr/local
#这和我们上面设置的WORKDIR有关
查看镜像变更历史
docker history 镜像id
发布自己的镜像
1:Docker Hub
1:地址 https://www.docker.com/products/docker-hub/注册账号
2:确定账号登陆正常
3:服务器上提交自己的镜像
[root@VM-4-6-centos ~]# docker login --help
#docker login 登陆
#docker logout 登出、退出
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
#docker login -u bzovo0415
#Password: 输入密码
4:推送我们的镜像到Docker Hub
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 36abcb2d3643 17 hours ago 591MB
#docker push mycentos:0.1 docker push REPOSITORY ID:TAG 这里的tag必须是本地存在的
REPOSITORY TAG IMAGE ID CREATED SIZE
bzovo0415/bzovo-centos 1.0 36abcb2d3643 17 hours ago 591MB
bzovo-centos 1.0 36abcb2d3643 17 hours ago 591MB、
#给镜像打tag
#docker tag 36abcb2d3643 bzovo-centos:1.0 docker tag imageID 新镜像名:tag号
TODO:为什么Push到docker hub之前要给镜像打tag?
#推送镜像
#docker push bzovo0415/bzovo-centos:1.0 docker push 用户名/镜像名称:[tag]
Docker部署Springboot项目
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0...
==修改maven-resources-plugin的版本==
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--在这里修改版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<!---->
</plugins>
</build>
1:打包好后上传我们的Dockerfile和jar包
2:附上编写的Dockerfile
FROM openjdk:8-jdk-alpine
LABEL maintainer="ziyun.xu2@dxc.com"
COPY *.jar /springboot/service-sms-0.0.1-SNAPSHOT.jar
EXPOSE 8005
ENV TZ="Asia/Shanghai"
CMD ["java", "-jar", "/springboot/service-sms-0.0.1-SNAPSHOT.jar"]
3:进入到我们上传Dockerfile目录(/www/wwwroot)
4:docker build -t bzovo-keshe . 通过Dockerfile构建镜像 . 系统会自动去找Dockerfile名字的文件
#docker log -f -t --tail 100 container_id 查看容器日志
5:docker logs -f -t --tail 100 bf185badda5e
#容器运行命令 -d 保持后台运行 -p指定 主机(宿主)端口:容器端口 --name给运行容器命名 94f4791466b4 container id(容器id)
6:docker run -d -p 9999:9999 --name bzovo 94f4791466b4
#进入容器命令 weather
7:docker exec -it weather /bin/sh
#尝试访问
7:121.4.32.107:9999 发现服务已经跑起来了
Docker部署时区慢了8H解决方案
原因:是因为docker容器中的时间是UTC,相比中国时间慢了8H
查看时区:date
有以下两种解决方案
1:把本机时区复制到宿主机即可:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
2:创建dockerfile文件的时候,自定义该镜像的时间格式及时区
在dockerfile文件里添加RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
3:修改服务器时间
date 查看服务器时间
date -s 10:34 修改时区时间
4:tzselect 同步时区
实例
查看建立的软链接
ls -il