Docker概述
Docker文档地址
官网:https://www.docker.com
文档地址:https://docs.docker.com
仓库地址:https://hub.docker.com
Docker安装
Docker的基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像=>run=>tomcat01容器(提供服务器)
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。
启动、停止、删除等基本命令
可以把容器理解成一个简易的linux系统
仓库(repository):
存放镜像的位置
仓库分为公有仓库和私有仓库
安装Docker
环境准备
环境检查
# 系统内核
[root@master ~]# uname -r
3.10.0-862.el7.x86_64
# 系统信息
[root@master ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装准备
# 1.卸载老版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安装包
sudo yum install -y yum-utils
# 3.设置镜像仓库
#删除异常源
sudo rm -f /etc/yum.repos.d/docker-ce.repo
# 使用官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
# 推荐使用阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4.更新yum软件包索引
sudo yum makecache fast
# 5.安装docker相关的 docker-ce社区
sudo yum install docker-ce docker-ce-cli containerd.io
# 6.启动docker
systemctl start docker
docker version # docker 判断是否安装成功
# 7.测试docker
docker run hello-world
# 8.查看刚才下载的 hello-world 镜像
docker images
了解:卸载docker
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker # docker的默认工作路径
开始->Docker会在本机寻找镜像->到Docker Hub上下载
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问
DockerServer接收到Docker-Client的指令,就会执行这命令
Docker为什么比VM快?
1.Docker有比虚拟机更少的抽象层
2.Docker利用的是宿主机的内核,VM需要Guest OS
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器
docker 命令 --help
帮助文档的地址:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@master ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs
docker search 搜索镜像
[root@master ~]# docker search mysql
官网: https://hub.docker.com
# 过滤搜索 STARS 大于 3000
docker search mysql --filter=STARS=3000
docker pull 下载镜像
[root@master ~]# docker pull mysql
Using default tag: latest # 如果不写 tag, 默认就是 latest
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete # 分层下载,docker image的核心 联合文件系统
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
[root@master ~]# docker pull mysql:5.7 # 指定tag版本下载
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists # 已经存在的文件就不用再次下载,联合文件系统
0bdc5971ba40: Already exists
97ae94a2c729: Already exists
f777521d340e: Already exists
1393ff7fc871: Already exists
a499b89994d9: Already exists
7ebe8eefbafe: Already exists
4eec965ae405: Pull complete
a531a782d709: Pull complete
270aeddb45e3: Pull complete
b25569b61008: Pull complete
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIyVmXxK-1591324844048)(/Users/elaiza/Library/Application Support/typora-user-images/image-20200603212242306.png)]
docker rmi -f IMAGE ID 删除镜像
[root@master ~]# docker rmi -f a4fdfd462add # 根据镜像ID去删除
[root@master ~]# docker rmi -f $(docker images -aq) # 递归删除全部镜像
容器命令
说明:我们有了镜像才可以创建容器,linux, 下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-P 指定容器的端口 -P 8080:8080
-p 随机指定端口
# 进入centos容器
[root@master ~]# docker run -it centos /bin/bash
[root@9393dd5e2d90 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 退出容器
[root@9393dd5e2d90 /]# exit
列出正在运行的容器
docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器ID
docker ps -aq
退出容器
exit # 容器停止加退出
ctrl + P + Q # 容器不停止退出
删除容器
docker rm 容器ID # 删除指定容器(但是不能删除正在运行的容器)
docker rm -f $(docker ps -aq) # 递归删除所有容器
docker ps -a -q|xargs docker rm # 递归删除所有容器
启动和停止容器的操作
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止当前运行的容器
docker kill 容器ID # 杀掉容器
常用的其他命令
后台启动容器
# 命令 docker run -d 镜像名
[root@master ~]# docker run -d centos
2c1e708856b7ed6d93804252a72699c9c3b5afa5d47192eb0eb44e8f652a2c70
# 问题docker ps, centos 停止了
# 原因:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志命令
# 开启
docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 2; done"
docker logs -ft 容器ID # 查看全部日志
docker logs -ft --tail 10 容器ID # 查看10条日志
查看容器中进程信息 ps
docker top 容器ID(正在运行)
[root@master ~]# docker top 96c7945dd950
查看镜像、容器元数据信息
docker inspect 容器ID
docker inspect 镜像名称
进入当前正在运行的容器
# 方式一: 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it
[root@master ~]# docker exec -it ed0bdaa79f35 /bin/bash
# 方式二: 进入容器正在执行的终端,不会启动新的进程
docker attach 容器ID
[root@master ~]# docker attach ed0bdaa79f35
从容器拷贝文件到主机上
docker cp 容器ID:目录 主机目录
[root@master ~]# docker cp f8dc02ea420e:/home/dockerDemo.java ./
小结
https://www.runoob.com/docker/docker-command-manual.html
练习
# 安装nginx
docker pull nginx
# 开启nginx
# nginx 的80端口映射到主机的3344端口
docker run -d --name nginx01 -p 3344:80 nginx
# 进入nginx容器,交互模式
docker exec -it nginx01 /bin/bash
# 官方推荐使用tomcat
docker run -it --rm tomcat:9.0
# 停止容器后,就删除,一般用于测试
# 安装tomcat镜像
docker pull tomcat
# 开启tomcat
# tomcat 的8080端口映射到主机的3344端口
docker run -d --name tomcat01 -p 3345:8080 tomcat
# 进入nginx容器,交互模式
docker exec -it tomcat01 /bin/bash
# 但是tomcat容器是阉割版的
# 将容器里的 webapps.dist/* 拷贝到 webapps就可以了
root@5dce35fc69b9:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 安装mysql 考虑数据持久化的问题
# 安装mysql5.7镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载,配置密码
docker run -d -p 3307:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=hadoop --name mysql01 mysql:5.7
mysql -hmaster -uroot -P3307 -p
# 解释命令
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 命名容器名字
可视化
Portainer
docker run -d -p 3346:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock \
--privileged=true portainer/portainer
Commit
# 1. 启动一个默认的tomcat
# 2. 发现这个默认的tomcat没有webapps应用,镜像的原因,官方默认没有
# 3. 自己拷贝文件
# 4. 将我操作过的镜像commit提交为一个镜像,我们以后就可以使用修改过的镜像
# 5. docker commit -a="elaiza" -m="add webapps app" 镜像ID tomcat02:1.0
容器数据卷
如果数据都在容器中,那么我们删除容器,数据就会被丢失
docker run -it -v /root/dockerhome:/home centos /bin/bash
具名和匿名挂载
# 匿名挂载: -P 随机端口 -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的 volume 的情况
docker volume ls
# 具名挂载(名字) -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看具名挂载到的主机路径
docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-06-04T00:08:14+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/9afbf1895cf34b6faab0c9283ed03e49262b7a93e06a78e3d7ef6852276042c4/_data",
"Name": "9afbf1895cf34b6faab0c9283ed03e49262b7a93e06a78e3d7ef6852276042c4",
"Options": null,
"Scope": "local"
}
]
扩展:
推荐是使用具名挂载
# 如何确定具名挂载还是匿名挂载还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内路径, ro rw 读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一但这个设置了容器权限,容器对我们挂载出来的内容就有限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作
DockerFile
什么是dockerFile
就是用来构建docker镜像的构建文件
通过脚本可以生成镜像,镜像是一层一层的,脚本一个一个的命令,每个命令都是一层
构建步骤
1.编写一个dockerfile文件
2.docker build 构建一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub)
# 一、创建dockerfile文件
cd /root/docker-test-volume
vim dockerFile01
# 第一层
FROM centos
# 第二层:匿名挂载,开启容器的时候会在容器内自动生成,对应的主机也会挂载
VOLUME ["volume01","volume02"]
# 第三层
CMD echo "---end---"
# 第四层
CMD /bin/bash
# 二、创建镜像
docker build -f ./dockerFile01 -t elaiza/centos:1.0 .
# 三、启动容器进入容器,可以发现匿名挂载的目录
docker run -it 0003ac258a85 /bin/bash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ceRv8TUI-1591324844049)(/Users/elaiza/Library/Application Support/typora-user-images/image-20200604112556375.png)]
# 四、查看主机上的挂载目录信息
docker inspect 0003ac258a85
DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,不能追加执行
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令执行
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发命令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量! 如mysql的密码设置
实操
Centos
# 创建增强版的centos
# 1. 编写DockerFile文件
FROM centos
MAINTAINER elaiza<122323@qq.com>
ENV MYPATH /uer/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文件路径 -t 镜像名:[tag] .
docker build -f dockerfile-centos -t elaizacentos:1.0 .
# 3. 进入容器[tag]
docker run -it elaizacentos:1.0
# 4. 通过 docker history 镜像ID 查看安装过程
docker history 7b461ae0ac71
tomcat
# 1. 准备 tomcat 和 jdk 的压缩包
# 2. 创建DockerFile
# 3. 编写DockerFile
FROM centos
MAINTAINER elaiza<122323@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u45-linux-x64.gz /usr/local/
ADD apache-tomcat-9.0.35.tar /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_45
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out
# 构建镜像(最好打标签tag)
docker build -t elaizatomcat:1.0 .
# 开启容器(后台运行tomcat,挂载apps目录和日志目录)
docker run -d -p 9090:8080 --name elaizatomcat01 -v /root/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /root/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs elaizatomcat
# 进入
docker exec -it 0b7d93c5fe32 /bin/bash
发布镜像
# 1. 登录
docker login -u elaiza 密码:elaiza112233
# 2. push镜像到服务器(要对镜像打标签)且在 elaiza目录下
docker tag e955e82245d3 elaiza/elaizatomcat:1.0
docker push elaiza/elaizatomcat:1.0
容器间的数据共享
数据卷容器
docker run -it --name docker01 centos
docker run -it --name docker02 --volumes-from docker01 centos
发布SprintBoot项目
# 建立Dockerfile文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
# 将jar包和Dockerfile放到同一目录,构建镜像
docker build -t sp8080 .
# 开始容器
docker run -d -P --name sp8080-web sp8080