1. 背景了解
1.Docker概述
①docker的思想来源于集装箱,刚刚诞生的时候,没有引起行业的注意。
②2013年将docker开源,越来越多的人发现了docker的优点。Dcoker每个月都更新一个版本,
③2014年4月9日,Docker 1.0发布
④Docker获得原因,十分的轻巧。在容器技术出来之前,我们都是使用虚拟机技术。虚拟机:安装虚拟机软件,通过该软件可以虚拟出来一台或者多台电脑。笨重
⑤虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术
⑥Docker是基于Go语言开发的仓库地址。
2. Dokcer安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 一条命令安装
docker version # 查看是否安装成功(显示版本信息)
3.常用命令
3.1 镜像命令
镜像命令:
1. docker images # 查看现有的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像的仓库源 镜像的标签 镜像的id 镜像的创建时间 镜像的大小
2. 可选项
-a, --all # Show all images (default hides intermediate images)列出所有的镜像
-q, --quiet # Only show image IDs 只显示所有的id
3. docker search # 搜索
docker search mysql
# 可选项:
# docker search --help
4. docker pull [name] # 下载镜像
例:docker pull mysql<==>docker pull docker.io/library/mysql:latest
Using default tag: latest #如果不写tag,默认就是latest
latest: Pulling from library/mysql
15115158dd02: Pull complete # 分层下载,docker images的核心,联合文件系统
d733f6778b18: Pull complete
1cc7a6c74a04: Pull complete
c4364028a805: Pull complete
82887163f0f6: Pull complete
097bfae26e7a: Pull complete
e1b044d6a24f: Pull complete
cd2978bd4d12: Pull complete
28bce5cc1677: Pull complete
907b6d695760: Pull complete
c5049403458b: Pull complete
f360718d6f4e: Pull complete
Digest: sha256:0eb33f0094ef5351639d9d9847c963ee9f22f5631cde046babd4ec239aaeaf06 # 签名(防伪)
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
5. docker pull mysql:5.7 # 指定版本下载
6. docker rmi -f id/名称 # 删除镜像
7. docker rmi -f id1 id2 id3 # 删除多个镜像
8. docker rmi -f $(docker images -aq) # 删除所有镜像
3.2 容器命令
# 有了镜像才有容器
1. docker run [可选参数] image 新建容器 并启动
# 参数说明
--name ='Name' # 容器名字 tomcat01 tomcat02 用来区分容器
-d # 后台启动
-it # 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-p 随机指定端口
2. docker run -it centos /bin/bash #启动并进入容器
exit #容器停止并退出主机
ctrl+P+Q #容器不停止并退出
docker ps # 列出当前运行的容器
docker ps -a # 列出历史运行过的容器+当前运行
docker ps -n=x #显示最近创建的x个容器
docker ps -q # 只显示容器的id
3. docker rm id #删除容器 不能删除运行当中的容器 如果要强制删除 rm -f
①.docker rm $(docker ps -aq) # 删除容器方式1
②.docker ps -a -q| xargs docker rm # 删除容器方式2
4. 启动和停止容器的操作
docker start id # 启动容器
docker restart id #重启命令
docker stop id # 停止命令
docker kill id # 杀掉容器
docker run -d centos # 后台启动容器
5. 查看日志
docker logs
6. docker inspect id # 查看容器源信息(比较重要)
7. docker exec -it id bashShell # docker exec -it 6dc8355cbc2d /bin/bash 进入当前运行的容器 开启新的终端可以在里面操作
docker attach 6dc8355cbc2d # 进入容器正在执行的终端不会启动新的进程,进去之后还是之前原来运行的界面。
8. docker cp id:容器内路径 目的主机路径 # 拷贝文件
docker cp 6dc8355cbc2d:/root/zl/test.py /root/zhouluF/ # 从容器内考到本机上
9. 部署nginx
docker run -d --name nginx01 -p 3344:80 # 后台启动nginx并且将80(nginx默认端口)映射到公网的中的3344端口(端口映射)
# -d 后台运行
# --name 给容器起名字
# -p 服务器外部端口:容器内部端口
docker exec -it nginx01 # 每次改动nginx配置文件,都需要进入容器 十分麻烦我们要是可以在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部可以自动修改
10. tomcat #部署一个tomcat
docker run -it --rm tomcat:9.0 #之前都是后天运行,停止后容器还可以查到 (--rm 用完即删除)
docker run -d -p 3355:8080 --name tomcat01 tomcat:5.7 # 给容器起别名
11. docker stats # 查看docker的cpu状态
12. portainer # 可视化 Docker 图像化界面管理工具,提供一个后台面板供我们操作
13. docker commit # 提交自己的镜像
14. docker commit -m='提交的描述信息' -a='作者' 容器id 目标镜像名:[tag]
15. systemctl restart docker # 重启docker
3.3 容器数据卷
1. 什么是容器数据卷?
如果数据都在容器中,删除容器数据就会丢失。怎么使得数据可以持久化。容器共享技术
docker产生的数据同步到本地,将容器的目录挂载到本地上。
2. 使用数据卷
①. 直接使用命令挂载;
docker run -it -v /root/zlF:/home centos bin/bash #docker run -it -v 主机目录(本地目录):docker目录 bin/bash
docker inspect id # 检查是否挂载成功 Mounts:
# 在容器内添加文件, 本地对应的目录下也会新增文件 (双向同步); 在本地上修改文件,容器内的数据也会修改
3. 安装mysql
①. docker run -d -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 # 映射多个目录
4. 具名挂载和匿名挂载
①. 匿名卷挂载
docker run -d -P --name nginx02 -v /etc/nginx nginx # -P 随机映射端口 -v 不指定本地目录 只指定容器内命令
docker volume ls # 查看所有卷的情况
②. 具名挂载
docker run -d -P --name nginx03 -v juming_nginx:/etc/nginx nginx # -v 卷名:容器内路径
docker volume inspect juming_nginx # 查看具体的挂载位置 通过具名挂载
③. 区分具名、匿名挂载还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /本地目录路径:容器内路径 # 指定路径挂载
④. 拓展 # ro和rw为读写权限
docker run -d -P --name nginx03 -v juming_nginx:/etc/nginx:ro nginx # ro只能通过本地目录操作,容器内不能改变
docker run -d -P --name nginx03 -v juming_nginx:/etc/nginx:rw nginx
5. dockerfile初识 # dockerfile就是用来构建docker镜像的构建文件 体验
# 通过这个脚本生成镜像 镜像都是一层一层的
# 创建dockerfile (名字可以随机)
# 文件内容 这里的每个命令就是一层一层的
from centos
VOLUME ["volume01", "volume02"] # 容器内的路径 匿名挂载
CMD echo "---end---"
CMD /bin/bash # 将这4行代码存入dockerfile1文件中
①. docker build -f /root/zhouluF/docker-test-volum/dockerfile1 -t zl/centos:1.0 . # 最后有个.
②. docker run -it zl/centos /bin/bash # 其中自己的容器
③. docker inspect 700672b95593
6. 数据卷容器(容器间数据共享)
①. docker run -it --name docker01 zl/centos:1.0
②. docker run -it --name docker02 --volumes-from docker01(数据卷容器) zl/centos:1.0 # docker02挂载到docker01上
# 在docker01上创建的文件同步到docker02上
③. docker run -it --name docker03 --volumes-from docker01 zl/centos:1.0
# docker2和docker03继承与docker01
# 测试:删除docker01的文件,docker02和docker03文件还是存在
3.4 Dockerfile dockerfile是用来构建docker镜像 命令参数脚本
1. 构建步骤:
①. b编写一个dockerfile文件
②.docker build构建成为一个镜像
③. docker run运行镜像
④. docker push发布镜像(dockerHub、阿里云镜像仓库)
2. dockerfile的构建过程以及基础知识:
1. 保留关键字都必须是的大写字母
2. 执行从上到下顺序执行
3. # 表示注释
4. 每一个指令都会创建提交一个新的镜像层,并提交
5.dockerfile 是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfilewe文件;
6.dockerfile:构建文件,定义了一切的步骤,源代码
7.dockerimages:通过dockerfile构建生成的镜像,最终发布和运行产品
8.docker容器:容器就想是镜像运行提供的服务器
3. dockerfile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的 姓名+邮箱📮
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录位置
EXPOSE # 暴露端口命令
CMD # 指定容器启动的时候要运行的命令,只有一个最后命令会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承dockerfile 这个时候就会运行ONBUILD的指令。出发指令
COPY # 类似ADD 将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
4. 构建自己的镜像(实战测试)
1. dockerhub中的99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来镜像构建的
2. 创建自己的centos
FROM centos:7
MAINTAINER zl<brucezlxxx@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 880 # 端口不能是被占用的
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
3. 通过以上文件构建自己的镜像(初体验)
docker build -f dockerfile_centos -t mycentos:0.1 .
docker history id # 我们可以列出本地镜像的变更历史,平时拿到一个镜像可以研究它是怎么做的
4. CMD和ENTRYPOINT的区别
vim dockerfile_centos1
"""
FROM centos:7
CMD ["ls", "-a"]
"""
docker build -f dockerfile_centos1 -t cmdtest .
docker run cmdtest -l # 报错 cmd的情况下 -l 替换了cmd["ls", '-a']命令, -l不是命令所以报错
docker run cmdtest ls -al #不报错
vim dockerfile_centos2
"""
FROM centos:7
ENTRYPOINT ["ls", "-a"]
"""
docker build -f dockerfile_centos2 -t cmdtest2 .
docker run cmdtest2 -l # 不报错
5. 制作tomcat镜像
1. 准备镜像文件, jdk文件压缩包
2.编写dockerfile文件 官方文件Dockerfile build会自己寻找
FROM centos:7
MAINTAINER brucezlxxx
COPY readme.txt /usr/local/readme.txt
ADD OpenJDK10U-jdk_aarch64_linux_hotspot_10.0.2_13.tar.gz /usr/local/
ADD apache-tomcat-9.0.60.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk10.0.2
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.60
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.60
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 1234
CMD /usr/local/apache-tomcat-9.0.60/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.60/bin/logs/catalina.out
6. 构建镜像
docker build -t diytomcat .
3.5 发布自己的镜像
1. 地址https://hub.docker.com 注册账号
2. 确定自己的账号可以提交
3. 在服务器提交镜像
docker login -u brucezldocker
docker push mycentos:0.1 # (一定要带上版本号)
# 喜爱是拒绝 denied: requested access to the resource is denied
docker tag 5adb0559c8f8 zl/mycentos:1.0
docker push zl/mycentos:1.0
来源狂神说。