赞
踩
docker安装和使用
sudo apt upgrade && sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt-cache policy docker-ce
到目前这一步docker-ce
还未安装,但根据上一步中的列表,可以看到 docker-ce 来自 Docker 官方版本库。
sudo apt install docker-ce
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/
镜像是 Docker的一个核心概念,Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
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的镜像全部是出自于官方的镜像。
例如把官方的ubuntu镜像下载到计算机
docker pull ubuntu
images
命令来列举下载了哪些镜像docker images
例如删除刚才演示的hello-world镜像
docker image rm hello-world 或者 docker rmi hello-world
(在删除镜像前应该先删除该镜像所启动的容器,这个方法放在后面容器部分写)
删除时可以使用镜像的短ID、长ID、镜像名或者镜像摘要
容器是 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
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
Dockerfile
的内容为:
FROM httpd RUN echo '<h1>Hello, World!</h1>' > /usr/local/apache2/htdocs/index.html
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM
和 RUN
。
定制镜像一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 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
指令在定制镜像时是最常用的指令之一。其格式有两种:
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
docker run -d -p 8080:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
创建好账户就可以进行图形化管理docker了
最后在这里再推荐一下宝塔面板也有管理docker的功能:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。