Docker基础

142 阅读1分钟

Docker基础

1. 镜像操作

1.1 pull命令

下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从 Docker Hub hub.docker.com/ 的仓库中拉取。

docker pull tomcat:9.0.20-jre8-alpine
docker images
docker image ls

1.2 save命令

mkdir -p /data
cd /data
docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar
  • linux中>表示覆盖原文件内容(文件的日期也会自动更新),>>表示追加内容(会另起一行,文件的日期也会自动更新)。
  • -o 输出到的文件

1.3 load命令

docker load -i linux.tar
docker load < tomcat9.0.20.tar
  • --input , -i : 指定导入的文件。
  • 将输入重定向到 tomcat9.0.20.tar

1.4 inspect命令

docker inspect tomcat:9.0.20-jre8-alpine
  • 通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。

1.5 tag命令

docker tag tomcat:9.0.20-jre8-alpine lagou/tomcat:9

标记本地镜像,将其归入某一仓库。

1.6 删除镜像

docker rmi tomcat:9.0.20-jre8-alpine
docker image rm tomcat:9.0.20-jre8-alpine
  • -f, -force : 强制删除镜像,即便有容器引用该镜像;

1.7 清理镜像

我们在使用 Docker一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理。执行完命令后,还是告诉我们释放了多少存储空间。

docker image prune
  • -a, --all : 删除所有没有用的镜像,而不仅仅是临时文件;
  • -f, --force :强制删除镜像文件,无需弹出提示确认

2. 容器操作

2.1 启动容器

docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine
  • -i:以交互模式运行容器,通常与 -t 同时使用
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
  • d:后台运行容器,并返回容器ID 通常itd一起用
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
  • -e,--env:设置环境变量
  • -v,--volume:绑定一个卷
  • --privileged=false: 指定容器是否为特权容器
  • --name="": 为容器指定一个名称
  • --rm=false:指定容器停止后自动删除容器,不能和-d一起用
  • --restart=no:指定容器停止后的重启策略
    • no:容器退出时不重启
    • on-failure:容器故障退出(返回值非零)时重启
    • always:容器退出时总是重启,推荐各位小伙伴们使用

docker run -itd 和 docker run -d的区别

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 中有一个 COMMAND 参数,容器启动后会执行 COMMAND命令,它的默认值为 /bin/bash。也就是说容器在后台启动成功后,执行了 COMMAND 命令后直接关闭了。

了解到该原理后,我们可以通过在 docker run -d 后增加一个驻留在进程中长期运行的命令就可以保证容器不关闭了。

-i 选项指示 docker 要在容器上打开一个标准的输入接口,-t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入。

结论:

docker run -itd后容器正常运行

docker run -d后容器是停止状态

2.2 容器日志

docker logs -f tomcat9

2.3 删除容器

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine

需要先停止运行中的容器再删除,否则无法删除容器
docker stop tomcat9
按照容器名称删除
docker rm tomcat9

按照容器ID删除
docker rm 8dd95a95e687
  • -v:删除与容器关联的卷

2.4 列出容器

查看运行中的容器
docker ps tomcat9

查看所有容器
docker ps -a tomcat9
  • -a :显示所有的容器,包括未运行的。

2.5 创建容器

docker create :创建一个新的容器但不启动它。用法同 docker run命令。

2.6 启动、重启、终止容器

docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器

2.7 进入容器

有bash命令的linux系统:例如centos
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim
docker exec -it tomcat9.1 /bin/bash

没有bash命令的linux系统:例如alpine系统
docker run -it --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine
docker exec -it tomcat9.2 sh
  • docker attach 也可以进入容器,区别是 attch退出容器会导致容器的停止。

2.8 杀掉容器

docker kill tomcat9

3. Docker数据卷

容器中的管理数据主要有两种方式:

  • 数据卷:Data Volumes 容器内数据直接映射到本地主机环境
  • 数据卷容器:Data Volume Containers 使用特定容器维护数据卷

3.1 数据卷

  • 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
  • 命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
  • 匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。

数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,只是第一种是在宿主机内的特定目录下,

而后两种则在docker管理的目录下,这个目录一般是/var/lib/docker/volumes/

推荐大家使用宿主机数据卷方式持久化数据

docker官网推荐尽量进行目录挂载,不要进行文件挂载

docker run -v /宿主机绝对路径目录:/容器内目录 镜像名

3.1.1 宿主机数据卷

docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1314WOaiNI -v /data/mysql/data:/var/lib/mysql -v /data/mysql/config:/etc/mysql mysql:5.7.37

3.1.2 命名的数据卷

docker run -itd --name nginx -p 80:80 -v lagouedu-nginx:/etc/nginx nginx:1.19.3-
alpine

# 查看docker数据卷
docker volume ls

# 查看lagouedu-nginx宿主机目录
docker volume inspect lagouedu-nginx

# 进入docker数据卷默认目录
cd /var/lib/docker/volumes/lagouedu-nginx

# 查看文件
ls

# 所有的文件docker默认保存在_data目录中
cd _data

# 删除容器
docker rm $(docker stop $(docker ps -aq))

查看挂载数据是否还存在,通过查看数据,发现删除容器后,宿主机中的数据还存在
ls

3.1.3 匿名数据卷

docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine

# 查看docker数据卷
docker volume ls

# 查看宿主机目录
docker volume inspect dbd07daa4e40148b11....

# 进入docker数据卷默认目录
cd /var/lib/docker/volumes/dbd07daa4e40148b11....

# 查看文件
ls

# 所有的文件docker默认保存在_data目录中
cd _data

# 删除容器
docker rm $(docker stop $(docker ps -aq))

# 查看挂载数据是否还存在,通过查看数据,发现删除容器后,宿主机中的数据还存在
ls

3.1.4 清理数据卷

docker volume ls

清理数据卷
docker volume prune

3.1.5 容器目录权限

通过 -v 容器内路径: ro rw 改变读写权限
ro:readonly 只读
rw:readwrite 可读可写
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

例如:
docker run -d -P --name nginx05 -v lagouedu1:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v lagouedu2:/etc/nginx:rw nginx
ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

3.2 数据卷容器

在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

  • 创建一个父容器

创建一个==不需要==保持在运行状态的父容器做为数据卷容器

docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html centos:7.8.2003

/usr/share/nginx/html 是docker nginx 首页的位置

  • 挂载容器

使用 —volumes-from挂载nginx容器

docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3-alpine
  • 修改宿主机文件
echo "lagouedu nginx" > /data/nginx/index.html

打开网站发现首页是我们修改后的页面

  • 挂载其它容器测试数据共享
docker run -itd --name nginx02 -p 81:80 --volumes-from data-volume nginx:1.19.3-alpine

打开第二个nginx首页发现也是我们修改后的页面