20221130 Docker 1. 快速入门 - 安装、常用指令
参考资料
前言
2020 年学习了一套尚硅谷的 Docker 视频教程,基本的命令和概念都是了解的。在 2021 年报班拉勾教育又学习了一遍 Docker ,发现尚硅谷的视频教程有些知识缺漏,又因为懒,一直没有自己总结拉勾教育的 Docker 视频,一直留了尾巴,今天进行收尾。
在工作中用到 Docker 和 k8s 也越来越多,切身体会到了便利
容器化在工作中也会是一个趋势
视频时间
版本信息
官网最新版本:
视频版本:
练习版本:20.10.7
[root@VM-72-146-centos ~]# docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:56:35 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.8
GitCommit: 7eba5930496d9bbe375fdf71603e610ad737d2b2
runc:
Version: 1.0.0
GitCommit: v1.0.0-0-g84113ee
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker-compose 版本:v2.11.2
Docker 安装
Install Docker Engine on CentOS | Docker Documentation
yum list docker-ce
# 安装最新版:推荐大家安装最新版本
yum -y install docker-ce
systemctl start docker
systemctl status docker
systemctl enable docker
# 查看版本
docker version
配置镜像加速
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
systemctl daemon-reload
systemctl restart docker
docker-compse
网络下载
curl -L https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 > /usr/local/bin/docker-compose
或通过已下载的文件上传
mv docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose --version
Docker 介绍
2014年6月9日,Docker 1.0发布!1.0版本的发布,标志着 Docker 平台已经足够成熟稳定,并可以被应用到生产环境。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),本教程使用社区版(CE)
帮助指令
docker --help
查看 Docker 版本
docker -v
docker version
Docker 系统范围信息
docker info
Docker 命令分类
-
Docker 环境信息:
docker [info|version]
-
容器生命周期管理:
docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
-
容器操作管理:
docker [ps|inspect|top|attach|wait|export|port|rename|stat]
-
容器rootfs命令:
docker [commit|cp|diff]
-
镜像仓库:
docker [login|pull|push|search]
-
本地镜像管理:
docker [build|images|rmi|tag|save|import|load]
-
容器资源管理:
docker [volume|network]
-
系统日志信息:
docker [events|history|logs]
资源清理
删除已停止的容器、dangling 镜像、未被容器引用的 network 和 dangling 构建过程中的 cache
docker system prune
清理镜像
docker image prune
# 删除所有的镜像
docker rmi $(docker images -q)
清理容器
# 清理已经停止运行的docker容器
docker rm $(docker ps --all -q -f status=exited)
# 停止所有运行容器
docker stop $(docker ps -aq)
# 删除所有的容器
docker rm $(docker ps -aq)
# 停止并删除所有的容器
docker rm $(docker stop $(docker ps -q))
常用命令总结
Docker 镜像
镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构
一个镜像一般是由多个层组成
不同仓库中,可能也会存在镜像重名的情况发生, 这种情况咋办?
从严格意义上讲,我们在使用 pull命令时,还需要在镜像前面指定仓库地址(Registry), 如果不指定,则 Docker 会使用您默认配置的仓库地址。例如上面,由于我配置的是国内 docker.io的仓库地址,我在 pull 的时候,docker 会默认为我加上 docker.io/library 的前缀。
例如:当我执行 docker pull tomcat:9.0.20-jre8
命令时,实际上相当于 docker pull docker.io/tomcat:9.0.20-jre8
,如果您未自定义配置仓库,则默认在下载的时候,会在镜像前面加上 DockerHub 的地址。Docker 通过前缀地址的不同,来保证不同仓库中,重名镜像的唯一性。
命令
save
docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar
-o
:指定输出到的文件
# 保存多个镜像
docker save \
tomcat:9.0.20-jre8-alpine \
tomcat:9.0.20-jre8-slim \
tomcat:9.0.20-jre8 \
-o tomcat9.0.20.tar
load
docker load -i linux.tar
docker load < tomcat9.0.20.tar
-
--input , -i
: 指定导入的文件。 -
--quiet , -q
: 精简输出信息。
inspect
通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。
docker inspect 返回的是 JSON格式的信息,如果您想获取其中指定的一项内容,可以通过 -f
来指定,如获取镜像大小
也可以用于容器
docker inspect tomcat:9.0.20-jre8-alpine
docker inspect -f {{".Size"}} tomcat:9.0.20-jre8-alpine
history
列出各个层的创建信息
docker history tomcat:9.0.20-jre8-alpine
commit
从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- -a :提交的镜像作者
- -c :使用 Dockerfile 指令来创建镜像
- -m :提交时的说明文字
- -p :在commit时,将容器暂停
docker container commit -m "update index.html file" -a "laosiji" lagou-nginx lagouedu/nginx:v2
build
使用 Dockerfile 创建镜像
docker build [OPTIONS] PATH | URL | -
-
--build-arg=[] :设置镜像创建时的变量;
-
-f :指定要使用的Dockerfile路径;
-
--rm :设置镜像成功后删除中间容器;
-
--tag , -t :镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
Docker 容器
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
容器是基于镜像启动起来的,容 器中可以运行一个或多个进程。
镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
命令
cp
用于容器与主机之间的数据拷贝
# 宿主机文件复制到容器内
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
# 容器内文件复制到宿主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
-L
:保持源目标中的链接
docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
# 宿主机的index.html页面覆盖容器内的index.html页面
docker cp /data/index.html nginx:/usr/share/nginx/html/index.html
# 将容器内的nginx.cnf复制到宿主机中
docker cp nginx:/etc/nginx/nginx.conf /data
run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine
-
-d, --detach=false: 后台运行容器,并返回容器ID
-
-i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用
-
-P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴使用该参数
-
-p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用
-
-t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-
--name="nginx-lb": 为容器指定一个名称
-
-h , --hostname="laosiji": 指定容器的hostname
-
-e , --env=[]: 设置环境变量,容器中可以使用该环境变量
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
-
--link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数
-
-v, --volume : 绑定一个卷
-
--privileged=false: 指定容器是否为特权容器,特权容器拥有所有的 capabilities
-
--restart=no:指定容器停止后的重启策略
-
no:容器退出时不重启
-
on-failure:容器故障退出(返回值非零)时重启
-
always:容器退出时总是重启,推荐各位小伙伴们使用
-
-
--rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器
create
创建一个新的容器但不启动它。
用法同 docker run命令。
docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine
logs
获取容器的日志
docker logs [OPTIONS] CONTAINER
docker logs -f tomcat9
-
-f
:跟踪日志输出 -
--tail
:仅列出最新N条容器日志
ps
docker ps [OPTIONS]
# 查看运行中的容器
docker ps tomcat9
# 查看所有容器
docker ps -a tomcat9
输出详情介绍:
-
CONTAINER ID: 容器 ID
-
IMAGE: 使用的镜像
-
COMMAND: 启动容器时运行的命令
-
CREATED: 容器的创建时间
-
STATUS: 容器状态
-
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
-
NAMES: 自动分配的容器名称。
STATUS: 容器状态有7种:
-
created(已创建)
-
restarting(重启中)
-
running(运行中)
-
removing(迁移中)
-
paused(暂停)
-
exited(停止)
-
dead(死亡)
start、stop、restart
docker start tomcat9
docker stop tomcat9
docker restart tomcat9
exec
在运行的容器中执行命令。早期有 attach 命令,对于阻塞命令会等待,所以不方便。在 Docker 1.3.0 后提供了exec 可以在容器内直接执行任意命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it tomcat9.1 /bin/bash
docker exec -it tomcat9.2 sh
-
-i:即使没有附加也保持 STDIN 打开
-
-t:分配一个伪终端
inspect
docker inspect tomcat9
kill
强制停止一个运行中的容器
docker kill tomcat9
-s
:向容器发送一个信号
IDEA 集成 Docker
修改 Docker 配置
vim /usr/lib/systemd/system/docker.service
# 在ExecStart行最后增加,开放远程主机访问权限
-H tcp://0.0.0.0:2375
# 最后增加修改内容如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
# 重启docker
systemctl daemon-reload
systemctl restart docker
# 查看docker进程,发现docker守护进程在已经监听2375的tcp端口
ps -ef | grep docker
# 查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听
netstat -tulp | grep 2375
修改 IDEA 配置
设置 -> 构建、执行、部署 -> Docker -> +
新增 docker 服务器配置信息
配置内容如下:
name: Docker-DevCloud
TCP Socket:
Engine API URL: tcp://9.134.72.146:2375
配置成功后,会在idea开发工具下方窗口"8.services"里显示信息,右键点击connect。连接成功可以查
看到container和images等信息。可以对container和images进行各种相关操作。