Docker学习笔记
开始
安装
查看是否安装成功
docker version
hello world
docker run hello-world
查看镜像
docker images
配置阿里云
进入阿里云网站,找到容器镜像服务,按要求配置即可。
回顾hello-world流程
![image-20210630164950537](https://img2020.cnblogs.com/blog/2439937/202107/2439937-20210710135600978-1687574693.png)
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
帮助文档的地址:Reference documentation | Docker Documentation
镜像命令
docker images 查看本地主机上的镜像
wyihe@LAPTOP-K7UPH2AE:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 083d7564d904 2 weeks ago 28MB
hello-world latest d1165f221234 3 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
web:Docker Hub
wyihe@LAPTOP-K7UPH2AE:~$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11068 [OK]
mariadb MariaDB Server is a high performing open sou… 4193 [OK]
...
# 可选项,通过搜索来过滤
--filter=STARS=3000 # 搜索出来的镜像STAR大于3000的
docker pull 下载镜像
# docker pull 镜像名
wyihe@LAPTOP-K7UPH2AE:~$ docker pull mysql
Using default tag: latest # latest 默认最后一个版本
latest: Pulling from library/mysql
b4d181a07f80: Pull complete # 分层下载 image的核心 若存在,不会重复下载,节省内存
a462b60610f5: Pull complete
...
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
docker pull mysql:5.7
docker rmi 删除镜像
docker rmi -f 容器id # 删除指定容器,只会删除不重复的卷
docker rmi -f 容器id 容器id 容器id
docker rmi -f $(docker images -aq) # 删除全部容器
容器命令
我们有了镜像才可以创建容器,下载一个centos来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
# 测试,启动并进入容器
wyihe@LAPTOP-K7UPH2AE:~$ docker run -it centos /bin/bash
[root@7e35bed66e90 /]# ls # 操作容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7e35bed66e90 /]# exit # 退出容器
exit
wyihe@LAPTOP-K7UPH2AE:~$
列出所有运行的容器
docker ps # 正在运行的容器
-a # 当前运行+历史运行的容器
-n? # 显示最近创建的容器
-q # 只显示容器编号
退出容器
exit # 直接容器停止并退出
Ctrl+P+Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器,-f强制删除
docker rm $(docker ps -aq) # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制停止当前容器
常用其他命令
后台启动容器
docker run -d 镜像名
# 注意:若docker发现正在运行的容器没有前台进程,容器会停止运行
查看日志
docker logs
-tf # 显示日志
--tail NUMBER # 日志条数
查看容器中进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前正在运行的容器
docker exec -it 容器id bashshell # 进入容器开启一个新终端
docker attach #进入容器正在执行的终端
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的地主机路径
docker镜像
commit镜像
docker commit 提交容器成为一个新的镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -a="wyihe" -m="add webapps app" 44b2cb522fb6 w_tomcat:1.0
容器数据卷
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash # 双向绑定,一方更改另一方也会更改
具名挂载和匿名挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
匿名挂载
# 匿名挂载
-v 容器路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的 volume 情况
docker volume ls
root@LAPTOP-K7UPH2AE:/home/wyihe# docker volume ls
DRIVER VOLUME NAME
local 01d526bb3a4cd91d890161ef583e80e1e4c81e3db864be45861253095a791d1f
具名挂载
# 具名挂载
-v 主机目录没有/,将自动挂载到docker某指定目录
docker run -d -P --name nginx2 -v juming-nginx:/etc/nginx nginx
# 查看所有的 volume 情况
docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 查看一下这个卷,挂载地点为 "/var/lib/docker/volumes/juming-nginx/_data"
docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-07-05T03:34:53Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
扩展:权限
# 扩展
ro # 容器内只读,只能通过外部修改
rw # 容器内可读写
docker run -d -P --name nginx2 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx2 -v juming-nginx:/etc/nginx:rw nginx
初识dockerfile
方法二
dockerfile用来构建docker镜像的构建文件,命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层
创建镜像
# 创建一个dockerfile文件
FROM centos
VOLUME ["/volume01","/volume02"]
CMD echo "---end---"
CMD /bin/bash
# 生成镜像
docker build -f dockerfile01 -t wyihe/centos .
使用镜像
docker run -it 703f234db31c /bin/bash
![image-20210705124028869](https://img2020.cnblogs.com/blog/2439937/202107/2439937-20210710135602071-1839685510.png)
生成镜像的时候自动挂载的,数据卷目录
数据卷容器
# 生成有自动挂载目录的容器1(上)
docker run -it --name docker01 wyihe/centos bash
# 生成有自动挂载目录的容器2,链接容器1
docker run -it --name docker02 --volumes-from docker01 wyihe/centos
--volumes-from # son extend father
自动挂载的目录将同步
注意:共享文件是一个互相拷贝的概念。
DockerFile
DockerFile 介绍
用来构建 docker 镜像的文件。命令参数脚本
构建步骤:
- 编写一个 dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像 (dockerhub、阿里云镜像仓库)
DockerFile 构建过程
基础知识
- 每个保留关键字(指令)都必须是大写字幕
- 指令从上到下顺序执行
- # 表示注释
- 每个指令都会创建提交一个新的镜像层
步骤
DockerFile: 构建文件,定义了一切的步骤、源代码
DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来提供服务
DockerFile 指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容,比如tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替换
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile ,这个时候会运行 ONBUILD 指令,触发指令
COPY # 类似 ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
发布镜像
发布到DockerHub
官网
登录
docker login -u [user]
发布 update-centos
# docker tag 规范命名
docker tag update-centos wyihe/update-centos:1.0
# 提交镜像
docker push wyihe/update-centos:1.0 # 作者/镜像名:版本
发布到阿里云
进入阿里云容器镜像服务
参考官方文档
实战
部署Nginx
下载镜像 docker pull nginx
运行测试 docker run -d --name nginx01 -p 3344:80 nginx
进入容器 docker exec -it nginx01 /bin/bash
可访问 localhost:3344
退出容器 docker stop nginx01
部署Tomcat
# 官方的方法
docker run -it --rm tomcat:9.0 # --rm 容器用完即删(容器)
# 下载
docker pull tomcat
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
访问 localhost:3355
# 进入容器
docker exec -it tomcat01 /bin/bash
# 发现问题,是阉割过的
# 文件藏在webapps.dist里,把它复制到webapps里
cp -r webapps.dist/* webapps/
进入网页再看看,可以了
mysql同步数据
# 获取镜像
docker search mysql
docker pull mysql:5.7
# 启动mysql
docker run -d -p 3310:3306 -v /home/mysql/conf:/ect/mysql/conf.d -v /home/mysql/date:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名字
创建test库,对应的映射目录中出现test目录,映射成功
创建Centos
注:该操作基于update后的官方centos镜像
编写配置文件
FROM mycentos:1.0
MAINTAINER wyihe<wyiheyes@163.com>
ENV MYPATH /user/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
通过文件构建镜像
docker build -f mydockerfile -t mycentos:1.0 .
运行
docker run -it 623b44eae278
查看镜像的运行历史步骤
docker history wyihecentos:1.0