Docker笔记
大约 7 分钟
Docker笔记
术语
- 镜像:docker镜像好比一个模板,可以通过这个模板来创建容器服务,一个镜像可以创建多个容器
- 容器:docker利用容器技术,独立运行一个或一组应用,是通过镜像来创建的
- 仓库:存放镜像的地方,分为公有和私有仓库
常用命令
帮助命令
docker version # 查看版本信息
docker info # 显示docker系统详细信息,包括镜像和容器数量
docker --help # docker帮助命令
镜像命令
docker images:查看所有本地的主机上的镜像
sunshine@ubuntu:/var/lib$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all # 显示全部
-q, --quiet # 只列出镜像的ID
docker search:搜索镜像
sunshine@ubuntu:/var/lib$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12280 [OK]
mariadb MariaDB Server is a high performing open sou… 4722 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 911 [OK]
# 可选项
--filter=STARS=3000 #搜索出来的镜像star大于3000
docker pull:下载镜像
# docker pull 镜像名
sunshine@ubuntu:/var/lib$ docker pull mysql
Using default tag: latest # 若不写tag,则下载默认最新版
latest: Pulling from library/mysql
a4b007099961: Downloading [===============================> ] 17.04MB/27.15MB
e2b610d88fd9: Download complete # 分层下载,docker image的核心,联合文件系统
38567843b438: Downloading [=======================================> ] 3.279MB/4.179MB
5fc423bf9558: Download complete
aa8241dfe828: Download complete
cc662311610e: Download complete
# 等价于
docker pull mysql
docker pull docker.io/libraru/mysql:latest
# 指定版本下载
docker pull mysql:5.7
删除镜像
# docker rmi # 删除镜像
docker rmi -f id # 删除指定的容器
docker rmi -f id1,id2,id3 # 删除多个容器
docker rim -f $(docker images -aq) # 递归删除所有的镜像
容器命令
说明:有了镜像才能创建容器
运行容器
# docker run [可选参数] image
# 参数说明
--name='Name' # 容器名字
-d # 后台方式运行
-i -t # 使用交互运行,进入容器查看内容
-p # 指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口 ***
-p 容器端口
-p # 随机端口
# 代码
sunshine@ubuntu:/var/lib$ docker run -it centos /bin/bash # 交互方式进入容器
[root@01e9e6a98a07 /]# ls # 查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器
[root@01e9e6a98a07 /]# exit # 容器直接停止并退出
Ctrl+P+Q # 容器不停止并退出
查看当前运行中的容器
# docker ps命令 [可选项]
-a # 列出正在运行的容器+历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
sunshine@ubuntu:/var/lib$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 列出
sunshine@ubuntu:/var/lib$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01e9e6a98a07 centos "/bin/bash" 3 minutes ago Exited (130) 2 minutes ago recursing_hamilton
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,想要强行删除,则docker rm -f 容器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容器
# docker run -d 镜像名
sunshine@ubuntu:~/Desktop$ docker run -d centos
12c5f68b87bf8a172375c5476d62857c449cfbb69c8fb3f1f764842140f1ccf0
# 问题:docker ps发现centos运行后停止
# 常见的坑:docker容器使用后台运行时,必须要一个前台进程,docker发现没有应用,就会自动停止
# nginx容器启动后,发现自己没有提供服务,就会自动停止
查看日志
# docker logs
# 先执行一段shell脚本
sunshine@ubuntu:~/Desktop$ docker run -d centos /bin/sh -c "while true;do echo sunshine;sleep 1;done"
# 查看容器
sunshine@ubuntu:~/Desktop$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4dd3ff416a29 centos "/bin/sh -c 'while t…" 1 second ago Up 1 second admiring_morse
# 查看日志
sunshine@ubuntu:~/Desktop$ docker logs -tf --tail 10 4dd3
2022-03-21T14:41:35.693737323Z sunshine
2022-03-21T14:41:36.696700801Z sunshine
2022-03-21T14:41:37.702567538Z sunshine
………………(一直在打印)
查看容器中的进程信息
# docker top
sunshine@ubuntu:~/Desktop$ docker top 573ae
UID PID PPID C STIME TTY TIME CMD
root 5849 5817 0 07:44 pts/0 00:00:00 /bin/bash
查看镜像元数据
# docker inspect
sunshine@ubuntu:~/Desktop$ docker inspect 573
[
{
"Id": "573ae211654ec00a861e93f736ee548a895b15d0d63726fed680ec3cdd1e7c6a",
"Created": "2022-03-21T14:44:08.910813485Z",
"Path": "/bin/bash",
"Args": [],
"State": {
……………………
进入当前正在运行的容器
# 容器通常是使用后台运行的,当需要进行配置时,需要进入容器
# docker exec -it 容器id /bin/bash
sunshine@ubuntu:~/Desktop$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
573ae211654e centos "/bin/bash" 40 minutes ago Up 40 minutes condescending_ramanujan
sunshine@ubuntu:~/Desktop$ docker exec -it 573a /bin/bash
[root@573ae211654e /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# docker attach 容器id
sunshine@ubuntu:~/Desktop$ docker attach 573
[root@573ae211654e /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# exec与attach区别
# exec:进入容器后开启一个新的终端,可以在里面操作
# attach:进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机
# docker cp 容器id:容器内路径 目的主机路径
root@ubuntu:~# docker cp 0c402:/home/sunshine.txt /home
root@ubuntu:~# cd /home
root@ubuntu:/home# ls
sunshine sunshine.txt
docker部署nginx
# docker pull nginx # 安装nginx镜像
# docker run -d --name nginx_sms -p 8080:8080 nginx # 启动nginx并开放8080端口
如何提交镜像
docker commit # 提交容器成为一个副本
# 命令和git类型
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker数据卷
什么是数据卷
# 容器之间数据共享! Docker容器中产生的数据,同步到本地,这就是卷技术。将容器目录挂载到本地
使用数据卷
# 方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器目录

安装MySQL
# 下载MySQL
sunshine@ubuntu:~/Desktop$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
f003217c5aae: Already exists
65d94f01a09f: Already exists
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
# 启动并映射MySQL文件
sunshine@ubuntu:~/Desktop$ docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=a123456 --name mysql01 mysql
e1760c840056f305f332910729205d53be580b3e75d68274878da27997f47ff7
# 命令解析
-d 后台运行
-p 端口映射
-v 数据卷挂载,可以写多个-v
-e 环境配置(例如密码)
--name 设置容器名字
具名挂载和匿名挂载
# 匿名挂载(只写容器内路径而不写容器外路径)
-v 容器内路径
sunshine@ubuntu:/home/mysql/data$ docker run -d --name nginx011 -v /ect/nginx nginx
2c30a7dc28d58838e134b7ff11607bf4b1fbe439e74e4121b39633551468c677
# 具名挂载(通过-v 卷名:容器内路径)
sunshine@ubuntu:/home/mysql/data$ docker volume ls
DRIVER VOLUME NAME
local 9969e71d3d42254338c4f10ae4fcc603b2a0e5062d8f53dd6890b31be2e86c33
local juming-nginx
# 查看一个卷
sunshine@ubuntu:/home/mysql/data$ docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-04-11T06:35:40-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 路径
"Name": "juming-nginx", # 卷名
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录情况下都是在 /var/lib/docker/volumes/xxx
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-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
Dockerfile
# Dockerfile 就是用来构建docker镜像的构建文件,就是一段命令脚本,通过脚本生成镜像
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
# 这里的每个命令,就是镜像的一层

Loading...
