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 主机目录:容器目录
image-20220410140541089
image-20220410140541089

安装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  

# 这里的每个命令,就是镜像的一层
image-20220411233221809
image-20220411233221809
上次编辑于:
贡献者: minmengwei
Loading...