概念:什么是Docker?
Docker 是一个开源平台,包含容器引擎和Docker Hub注册服务器。
Docker容器引擎:该引擎可以让开发者打包他们的应用和依赖包到一个可移植的容器中,然后将其发布到任务流行的Linux机器上。
Docker Hub注册服务器:用户可以在该服务器上创建自己的镜像库来储存、管理和分享镜像。利用Docker,可以实现软件的一次配置、处处运行。
Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,其源代码托管在GitHub上,它基于Go语言并遵从Apache 2.0协议。
Docker是容器的一种,容器是一种轻量级的虚拟技术,是一种基于操作系统的虚拟技术,它运行在操作系统之上的用户空间,所有的容器都共用一个系统内核,甚至是公共库容器引擎提供进程级别的隔离,让每个容器都像运行在单独的系统之上,但又能够共享很多底层资源,比起虚拟机,容器更为轻量、快速、易于管理。除了Docker,常见的容器还有Solaris Zones、BSD iails、OpenVZ和LXC等。
Ubuntu20.04下安装Docker
一、设置储存库
1.安装软件包以允许使用 基于 HTTPS 的存储库:
apt-get install ca-certificates curl gnupg lsb-release
2.添加 Docker 的官方 GPG 密钥:
mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3.使用以下命令设置存储库:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
二、安装 Docker 引擎
1.更新包:
apt update
2.安装 Docker Engine、containerd 和 Docker Compose:
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.通过运行映像验证 Docker 引擎安装是否成功:
docker run hello-world
当容器运行,会打印确认消息并退出。
如果是非特权用户登录会有权限限制。
因为我们此时已经有了一个docker用户组,不需要创建,将用户加入到该组就可以获得操作docker的权限。
操作如下
测试无误即可。
usermod -aG docker USER # USER 为加入 docker 组的用户
newgrp docker # 刷新 docker 组
docker run hello-world # 测试无 root 权限能否使用 docker
容器的管理操作
1.创建容器
创建容器命令:
docker create
docker run
#两者区别在于前者创建的容器处于停止状态,后者创建容器并且启动了容器。
docker run 创建的容器马上进入运行状态,等同于docker create 创建容器后使用docker start 启动容器。创建容器后会返回容器id,id可以唯一标识一个容器,每一个容器的id都是独一无二的。
使用docker run 命令,可以创建两种类型的容器--后台型容器和交互型容器。 后台型: 运行在后台,创建启动后就与终端无关了。即便终端关闭了,后台容器依然存活,只有调用docker stop 或 docker kill 命令才能停止容器。 交互型: 运行在前台,会有交互的控制台给容器输入,也可以得到容器的输出。创建该容器的终端被关闭,在容器内部使用exit命令或者调用了docker stop\docker kill命令后就会停止。
实例1:创建一个交互型容器
docker run -i -t --name=test_ubuntu ubuntu /bin/bash
1.告诉Docker要运行docker run命令 2.-i 打开容器的标准输入(STDIN) 3.-t 告诉Docker为容器创建一个命令行终端 4.-i -t 这两个标志为我们和容器提供了交互shell 5.--name 为容器指定一个名字,没有这个选项会随机取一个名字 6.接下来就是使用镜像去创建容器,ubuntu是一个基础镜像,还可以使用其他基础镜像(ubuntu、centos、fedora等等) 7.最后告诉Docker要在容器里执行命令/bin/bash
以下是后台创建容器的流程图:
root@baida:~# docker run -i -t --name=test_ubuntu ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 76769433fd8a: Pull complete Digest: sha256:2adf22367284330af9f832ffefb717c78239f6251d9d0f58de50b86229ed1427 Status: Downloaded newer image for ubuntu:latest root@8ab8dd3eb0ba:/# @前面是我们在容器的登录用户root,后面的8ab8dd3eb0ba是容器的主机名。 ctrl+D/exit命令退出该容器,停止不代表销毁,只是不再是运行态。
实例2:创建一个后台型容器:
docker run --name test_ubuntu_1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
上面的命令没有像前面的容器那样关联一个shell,而是返回一个容器id后直接返回到了宿主主机的命令提示符。
2.查看容器
docker ps #查看当前运行的容器
docker ps -a #查看所有容器
docker ps -l #查看最新创建的容器
docker ps -n=x #查看最后创建的x个容器
使用-a选项多出一个名称是hopeful_bartik的容器,其状态是Exited(0),表示容器已经退出了,退出码是0。
使用-l选项告诉Docker只列出最后创建的容器。
使用-n=x选项,列出最后创建的x个容器,x为任意数。
-CONTAINER ID:唯一标识容器的id,是一个64位的十六进制数,对某个容器的操作可以通过它来标识操作目标,而在显示的时候一般会显示12位。 -IMAGE:创建容器时使用的镜像。 -COMMAND:容器最后运行的命令。 -CREATED:创建容器的事件。 -STATUS:容器的状态。如果时运行状态,则类似Up 2 minutes的形式,其中2分钟是容器已经运行的时间;如果容器时停止状态,则是类似Exited(0)的形式,其中数字0是容器退出的错误码,0为正常退出,其他数字则表示容器内部出现错误。 -PORTS:对外开放的端口。 -NAMES:容器名。和容器id一样都可以唯一标识一个容器
3.启动容器
通过docker run命令创建的容器会直接进入到运行状态,而通过docker create命令创建的容 器则会进入到停止状态,想要运行该容器,则可以通过docker start 命令来启动它。 当容器运行完自己的任务后,容器会退出,进入到停止状态,如需要再次启动该容器,使用docker start 命令来启动。
这里通过docker start启动之前停止的test_ubuntu
容器在运行过程中,总是不可避免出现各种问题,严重的会导致容器因为异常而退出。而有时我们需要根据错误代码来判断容器是否需要重启。默认情况下,容器是不重启的,为了让容器在退出时能自动重启,需要用到--restart参数。
--restart 标志会检查容器的退出码,并根据此来决定是否需要重启容器。
--restart 标志设置为always,不管容器的返回码是什么,docker都会尝试重启容器。 --restart 标志设置为on-failure,当容器的返回值非0,Docker才会重启容器。该标志还接受一个可选的重启次数。例如--restart=on-failure:5,收到一个非0的返回码时,最多尝试重启容器5次。
4.终止容器
当容器发生严重的错误时,容器会因为异常而退出并带有错误码,这时可以通过错误码来判定容器内部发生的错误。正常情况下,交互型容器和后台型容器都可以采用docker stop命令来停止:
docker stop test_ubuntu
除了通过容器名还可以通过id来停止容器。
docker stop 命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出的。当然,容器内部程序可以捕获该信号并自行处理,也可以选择忽略。如果要强行停止一个容器,则需要使用docker kill命令,它会给容器的进程发送SIGKILL信号,该信号将会是容器必然退出。
5.删除容器
当一个容器停止时,并没有消失,只是进入了停止状态,还可以重新运行。不需要改容器可以使用docker rm 命令删除它:
docker rm mystifying_jones
正在运行的容器需要先停止才能删除,可以使用docker rm -f 强制删除。
Docker 没有提供一次性删除所有容器的命令,可以使用下面的命令实现这个目的:
docker rm -f `docker ps -a -q` -a 列出所有容器 -q 只列出容器的id,不包括容器的其他信息,然后将这个列表传给docker rm -f 命令,依次删除容器
小结:
主要了解docker,以及关于docker的简单操作。
参考资料: 《Docker开发实践》《Docker技术入门与实战-第3版》