使用 APT 安装docker
docker安装和使用
更新软件包索引
sudo apt upgrade && sudo apt update

安装下载Docker的必要依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
把官方 Docker 版本库的 GPG 密钥添加到系统中
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
将 Docker 版本库添加到APT源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

用新添加的 Docker 软件包来进行升级更新
sudo apt update

确保从 Docker 版本库,而不是默认的 Ubuntu 版本库进行安装
sudo apt-cache policy docker-ce

-
到目前这一步
docker-ce还未安装,但根据上一步中的列表,可以看到 docker-ce 来自 Docker 官方版本库。
Docker的最终安装
sudo apt install docker-ce

检查 Docker 是否正在运行
sudo systemctl status docker

-
至此,docker安装完成
附:语法格式和所有可用命令
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default
"/root/.docker")
-c, --context string Name of the context to use to connect to
the daemon (overrides DOCKER_HOST env var
and default context set with "docker
context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level
("debug"|"info"|"warn"|"error"|"fatal")
(default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA
(default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default
"/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default
"/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
app* Docker App (Docker Inc., v0.9.1-beta3)
builder Manage builds
buildx* Docker Buildx (Docker Inc., v0.8.2-docker)
config Manage Docker configs
container Manage containers
context Manage contexts
image Manage images
manifest Manage Docker image manifests and manifest lists
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
scan* Docker Scan (Docker Inc., v0.17.0)
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Run 'docker COMMAND --help' for more information on a command.
To get more help with docker, check out our guides at https://docs.docker.com/go/guides/
-
汉化后:
用法:docker [选项] 命令
A self-sufficient runtime for containers
选项:
--config string 客户端配置文件的位置(默认
“/root/.docker”)
-c, --context string 用于连接到守护程序的上下文名称 (覆盖 DOCKER_HOST env var
和使用“docker context use”设置的默认上下文)
-D, --debug 启用调试模式
-H, --host list 列出要连接的守护进程套接字
-l, --log-level string 设置日志级别
("debug"|"info"|"warn"|"error"|"fatal")
(默认 "info")
--tls 使用 TLS; implied by --tlsverify
--tlscacert string 仅信任该 CA 签名的信任证书
(default "/root/.docker/ca.pem")
--tlscert string TLS 证书文件的路径 (默认
"/root/.docker/cert.pem")
--tlskey string TLS 密钥文件的路径 (默认
"/root/.docker/key.pem")
--tlsverify 使用 TLS 并验证远程
-v, --version 打印版本信息并退出
Management Commands:
app* Docker 应用程序 (Docker Inc., v0.9.1-beta3)
builder 管理构建
buildx* Docker 构建x (Docker Inc., v0.8.2-docker)
config 管理 Docker 配置
container 管理容器
context 管理上下文
image 管理图片
manifest 管理 Docker 镜像清单和清单列表
network 管理网络
node 管理 Swarm 节点
plugin 管理插件
scan* Docker 扫描 (Docker Inc., v0.17.0)
secret 管理 Docker 密钥
service 管理服务
stack 管理 Docker 堆栈
swarm 管理群
system 管理 Docker
trust 管理对 Docker 镜像的信任
volume 管理卷
命令:
attach 将本地标准输入、输出和错误流附加到正在运行的容器
build 从 Dockerfile 构建镜像
commit 提交容器的更改并以此创建新镜像
cp 在容器和本地文件系统之间复制文件或文件夹
create 创建一个新容器
diff 检查容器文件系统上文件或目录的更改
events 从服务器获取实时事件
exec 在正在运行的容器中运行命令
export 将容器的文件系统导出为 tar 存档
history 显示镜像的历史
images 列举镜像
import 从 tarball 导入内容以创建文件系统镜像
info 显示系统范围的信息
inspect 返回有关 Docker 对象的低级信息
kill 杀死一个或多个正在运行的容器进程
load 从 tar 存档或 STDIN 加载镜像
login 登录到 Docker 注册表
logout 从 Docker 注册表中注销
logs 获取容器的日志
pause 暂停一个或多个容器内的所有进程
port 列出端口映射或容器的特定映射
ps 列出容器
pull 从注册表中拉取镜像或存储库
push 将镜像或存储库推送到注册表
rename 重命名容器
restart 重启一个或多个容器
rm 移除一个或多个容器
rmi 删除一个或多个镜像
run 在新容器中运行命令
save 将一个或多个图像保存到 tar 存档 (默认流式传输到 STDOUT)
search 在 Docker Hub 中搜索镜像
start 启动一个或多个停止的容器
stats 显示容器资源使用统计的实时流
stop 停止一个或多个正在运行的容器
tag 创建一个引用 SOURCE_IMAGE 的标签 TARGET_IMAGE
top 显示一个容器的运行进程
unpause 取消暂停一个或多个容器中的所有进程
update 更新一个或多个容器的配置
version 显示 Docker 版本信息
wait 等待阻塞,直到一个或多个容器停止,然后打印它们的退出代码
运行 'docker COMMAND --help' 以获取有关命令的更多信息。
要获得有关 docker 的更多帮助,请查看我们的指南 https://docs.docker.com/go/guides/
操作doccker镜像
-
镜像是 Docker的一个核心概念,Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
检查是否可以访问 Docker Hub 和从这个网站下载镜像
docker run hello-world

-
得到以下结果,说明机器访问 Docker hub 一切顺畅
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
-
执行此命令时,Docker 首先在本地查找
hello-world,如没有,它会从 Docker Hub(默认版本库)下载了该镜像。下载镜像后,Docker 会根据镜像创建一个容器,并执行该容器中的应用程序。
通过search命令来搜索 Docker Hub 上可用的镜像
-
例如搜索ubuntu的镜像
docker search ubuntu

-
此命令会在 Docker Hub 上搜索并返回名称与搜索字符串匹配的所有镜像列表,其中,在OFFICIAL列为ok的镜像全部是出自于官方的镜像。
使用pull命令来把镜像下载到计算机
-
例如把官方的ubuntu镜像下载到计算机
docker pull ubuntu

下载镜像后,可以用images命令来列举下载了哪些镜像
docker images

使用image rm或者rmi命令来删除已经下载的镜像
-
例如删除刚才演示的hello-world镜像
docker image rm hello-world 或者 docker rmi hello-world

-
(在删除镜像前应该先删除该镜像所启动的容器,这个方法放在后面容器部分写)
-
删除时可以使用镜像的短ID、长ID、镜像名或者镜像摘要
操作docker容器
-
容器是 Docker 一个核心概念。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
容器启动(两种方式)
-
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(
exited)的容器重新启动。
使用run命令来新建启动
-
例如基于本地的ubuntu镜像新建一个容器并启动,输出一个 “Hello World”,之后终止容器
docker run ubuntu /bin/echo 'Hello world'

-
这和直接在本地运行
/bin/echo 'Hello world'几乎没有区别 -
下面的命令会启动一个 bash 终端,允许用户进行交互。
docker run -t -i ubuntu /bin/bash

-
可以看到设备名从
ubuntu-local变成了容器的id:3afd9924415f,这个交互界面就是容器的交互界面
当利用
docker run来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从Docker Hub下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
使用container start来启动已终止的容器
-
例如直接将一个已经终止的运行过ubuntu镜像的容器启动运行
docker container start 3afd9924415f

-
这里我们使用
ps命令来验证这个容器是否运行(ps命令在后文)

-
可以看到用这个指令启动的容器不会自动被关闭
使用container stop来终止容器
-
例如终止正在运行的3afd9924415f容器
docker container stop 3afd9924415f

使用 -d 参数来守护态运行一个容器
-
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加
-d参数来实现。 -
例如不使用
-d参数运行容器
docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-
这里容器把输出结果直接打印到了宿主机上
-
例如使用了
-d参数运行容器
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用
docker logs查看)。
注: 容器是否会长久运行,是和
docker run指定的命令有关,和-d参数无关。
-
使用
-d参数启动后会返回一个唯一的 id,可以通过ps命令查看容器,也可以通过container ls命令来查看容器信息。
进入正在运行的容器
-
在使用
-d参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,可以使用
attach命令或exec命令
attach命令进入正在运行的容器(两种方式)
-
例如进入前面以守护态运行的容器
docker attach 900538299d44

-
如果从这个 stdin 中 exit,会导致容器的停止。

exec 命令进入正在运行的容器
-
exec命令边可以跟多个参数,例如-i-t参数 -
只用
-i参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。

-
当
-i-t参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

-
如果从这个 stdin 中 exit,不会导致容器的停止。

使用export命令导出容器快照为本地文件
-
例如导出前文中
900538299d44编号的容器快照为HelloWorld.tar
docker export 900538299d44 > HelloWorld.tar

使用import命令导入容器快照为镜像
-
例如导出前文中名为
HelloWorld.tar的本地容器快照文件为test/helloworld
cat HelloWorld.tar | docker import - test/helloworld

使用container ls -a命令查看所有容器(包括已终止的)
docker container ls -a

删除容器(两种方式)
使用 container rm 来删除一个处于终止状态的容器
-
例如删除id为
695795f49260的容器
docker container rm 695795f49260

使用container prune命令来清除所有处于终止状态的容器
docker container prune

以一个apache服务器为例说明如何利用 commit 理解镜像构成
-
commit命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用docker commit定制镜像,定制镜像应该使用Dockerfile来完成 -
启动一个命名为
webserver的容器,并且映射了 80 端口,这样就可以直接去访问这个容器里的apache服务器
docker run --name webserver -d -p 80:80 httpd

-
本地可以访问容器

-
现在,假设我们非常不喜欢这个页面,我们希望改成helloworld,我们可以使用
exec命令进入容器,修改其内容。
docker exec -it webserver bash echo '<h1>Hello, World!</h1>' > /usr/local/apache2/htdocs/index.html

-
刷新网页,我们可以看见网页内容改变了

-
我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过
diff命令看到具体的改动。
docker diff webserver

-
现在我们定制好了变化,我们希望能将其保存下来形成镜像。当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个
commit命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化,这个命令的语法格式是:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
-
我们可以用下面的命令将容器保存为镜像
docker commit --author "JasonCian" --message "修改了默认网页" webserver httpd:new

-
其中
--author是指定修改的作者,而--message则是记录本次修改的内容。这点和git版本控制相似,不过这些信息其实可以省略留空。 -
我们可以在
docker image ls中看到这个新定制的镜像

-
我们还可以用
docker history具体查看镜像内的历史记录,我们会发现新增了我们刚刚提交的这一层。
docker history httpd:new

-
新的镜像定制好后,我们可以来运行这个镜像。
docker run --name websever2 -d -p 81:80 httpd:new

-
我们新的容器绑定了81端口,如果访问这个页面的话应该与修改后的
webserver一样

-
至此,我们第一次完成了定制镜像,使用的是
docker commit命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储有了更直观的感觉。
警告:commit指令导致黑箱操作
-
使用
docker commit命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。 -
首先,如果仔细观察之前的
docker diff webserver的结果,你会发现除了真正想要修改的/usr/local/apache2/htdocs/index.html文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,将会导致镜像极为臃肿。 -
此外,使用
docker commit意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。
dockerfile创建一个简单apache服务器
-
在一个空白目录中,建立一个文本文件,并命名为
Dockerfile

-
Dockerfile的内容为:
FROM httpd RUN echo '<h1>Hello, World!</h1>' > /usr/local/apache2/htdocs/index.html

-
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,
FROM和RUN。
FROM 指定基础镜像
-
定制镜像一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个
httpd镜像的容器,再进行修改一样,基础镜像是必须指定的。而FROM就是指定 基础镜像,因此一个Dockerfile中FROM是必备的指令,并且必须是第一条指令。 -
在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
-
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 ubuntu、debian、centos、fedora、alpine 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
-
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为
scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。 -
以
scratch为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
RUN 执行命令
-
RUN指令是用来执行命令行命令的。由于命令行的强大能力,RUN指令在定制镜像时是最常用的指令之一。其格式有两种:-
shell 格式:
RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的RUN指令就是这种格式。
RUN echo '<h1>Hello, World!</h1>' > /usr/local/apache2/htdocs/index.html
-
exec 格式:
RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式,例如
RUN apt-get update
-
构建镜像
-
例如我们要用刚才的
Dockerfile构建一个叫helloworld:apache的镜像,就需要在Dockerfile文件所在目录执行以下指令
docker build -t helloworld:apache .

-
从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在
Step 2中,如同我们之前所说的那样,RUN指令启动了一个容器82680b886e98,执行了所要求的命令,并最后提交了这一层d8ce094d2420,随后删除了所用到的这个容器82680b886e98。 -
这里我们使用了
build命令进行镜像构建。其格式为:
docker build [选项] <上下文路径/URL/->
-
如果注意,会看到
docker build命令最后有一个.表示当前目录. -
当构建的时候,用户会指定构建镜像上下文的路径,
docker build命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
运行构建好的helloworld:apache镜像
docker run --name websever -d -p 81:80 helloworld:apache

用浏览器验证一下

安装portainer图形化界面
docker容器启动
docker run -d -p 8080:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

浏览器访问管理界面

-
创建好账户就可以进行图形化管理docker了

最后在这里再推荐一下宝塔面板也有管理docker的功能:

本文详细介绍了Docker的安装步骤,包括更新软件包、添加Docker仓库、安装和验证Docker服务。接着讲解了如何操作Docker镜像,如搜索、下载、列举和删除镜像。还阐述了容器的启动、终止、守护态运行、进入容器以及容器管理。通过Apache服务器实例展示了容器的使用,并讨论了使用Dockerfile创建自定义镜像。最后提到了Portainer图形化界面的安装与使用。


2300

被折叠的 条评论
为什么被折叠?



