Docker是一种应用程序,可简化容器中管理应用程序流程的过程。 容器使你可以在资源隔离的进程中运行应用程序。 它们类似于虚拟机,但是容器更容易移植,占用资源少,更依赖于主机系统的资源。
在本文中,将在Ubuntu 20.04上安装并使用Docker Community Edition(CE)。 同时简单使用容器和图像,最后将图像推送到Docker存储库。
本文假定你有sudo 组权限的用户账号,但不是root。
如果没有,在root 下创建一个
adduser sammy
usermod -aG sudo sammy
这样就建立了一个sudo 权限用户
1:安装Docker
首先更新所有的安装包:
sudo apt update
然后安装一些必备软件包,以便通过HTTPS使用软件包:
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仓库进行安装:
apt-cache policy docker-ce
最后才真正安装docker
sudo apt install docker-ce
docker 现在安装好了,守护程序也启动了,下次系统启用时,该进程也会启动。 检查它是否正在运行:
sudo systemctl status docker
可以看到:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-02-20 18:05:52 UTC; 5min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 11985 (dockerd)
Tasks: 8
Memory: 39.4M
CGroup: /system.slice/docker.service
└─11985 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
...
2:不用sudo 执行Docker命令
默认情况下,只能以root用户或由docker组中的用户运行docker命令,而docker组是在Docker安装过程中自动创建的。 为了不使用sudo前缀,需要加入doccker组:
sudo usermod -aG docker ${USER}
需要登出然后再登入这个组信息才会生效。或者这样也可以。我是登出再登入的,下面方式没试。
su - ${USER}
检查自己在哪些组的命令是:
id -nG
应该有如下信息显示
sammy sudo docker
如果添加别人入docker 组用下面命令,这里username是别人的用户名
sudo usermod -aG docker username
本文后面使用docker 命令都假设你是docker 组的,否则要加sudo
3:使用Docker命令
使用docker包括向其传递一系列选项和命令,后跟参数。 语法采用以下形式:
docker [option] [command] [arguments]
要查看所有可用的子命令,请键入:
docker
要查看特定命令可用的选项,请键入:
docker docker-subcommand --help
以下命令查看docker 系统信息:
docker info
4:Docker Image
Docker容器是从Docker映像构建的。 默认情况下,Docker从Docker Hub提取这些映像,Docker Hub是由Docker项目背后的公司Docker管理的Docker注册表。 任何人都可以在Docker Hub上托管其Docker映像,因此您需要的大多数应用程序和Linux发行版都将托管映像。
下面测试一个简单的hello-world:
docker run hello-world
应该有如下类似信息显示:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Docker最初无法在本地找到hello-world映像,因此它从默认存储库Docker Hub下载了该映像。 下载映像后,Docker会根据映像创建一个容器,并执行该容器中的应用程序,显示消息。
可以使用docker命令和search子命令来搜索Docker Hub上可用的映像。 例如,要搜索Ubuntu映像,请输入:
docker search ubuntu
在OFFICIAL列中,OK表示由项目背后的公司构建和支持的映像。 确定要使用的Image后,可以使用pull子命令将其下载到计算机上。
执行以下命令,将官方的ubuntu映像下载到本地:
docker pull ubuntu
下载映像后,可以使用带有run子命令的已下载映像来运行容器。 如在hello-world示例中看到的那样,如果使用run子命令执行docker时未下载映像,则Docker客户端将首先下载映像,然后使用该映像运行容器。
要查看已下载到计算机的Image,请键入:
docker images
显示信息如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f63181f19b2f 4 weeks ago 72.9MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
5: Docker 容器
在上一步中运行的hello-world容器是一个在发出测试消息后运行并退出的容器的示例。 容器可以比这有用得多,并且它们可以是交互式的。 毕竟,它们类似于虚拟机,但是对资源更友好。
举例来说,下面使用Ubuntu的最新映像运行一个容器。 -i和-t开关的组合使您可以交互式访问外壳:
docker run -it ubuntu
则有如下显示,并进入容器的ubuntu
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker run -it ubuntu
root@bd612e776819:/#
首先更新包列表:
root@bd612e776819:/# apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
比如安装nodejs
root@bd612e776819:/# apt install nodejs
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
然后,查看node的版本:
root@bd612e776819:/# node -v
v10.19.0
所有的操作只是针对这个容器。
如要退出,请键入:
exit
root@bd612e776819:/# exit
exit
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$
6:管理Docker 容器
在使用Docker一段时间后,您的计算机上将有许多活动(运行)和不活动的容器。 要查看活动的,使用:
docker ps
我这没有活动的,这样显示的:
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
要显示所有的容器,要这样:
docker ps -a
显示是这样的:
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd612e776819 ubuntu "/bin/bash" 53 minutes ago Exited (0) 22 minutes ago gallant_visvesvaraya
bdbf06b1c3bc hello-world "/hello" About an hour ago Exited (0) About an hour ago nifty_benz
查看最近建立的容器要用 -l
docker ps -l
要启动已停止的容器,请使用docker start,后跟容器ID或容器的名称。 让我们启动ID为bdbf06b1c3bc的基于Ubuntu的容器:
docker start bdbf06b1c3bc
这个ID 各有不同,docker ps -a 查看里看到的,下面是启动后,再用docker ps 查看:
docker start bd612e776819
bd612e776819
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd612e776819 ubuntu "/bin/bash" About an hour ago Up 7 seconds gallant_visvesvaraya
要停止正在运行的容器,请使用docker stop,后跟容器ID或名称。 这次,我们将使用Docker分配的容器名称gallant_visvesvaraya:
docker stop gallant_visvesvaraya
确定不再需要容器后,请使用docker rm命令再次使用容器ID或名称将其删除。 使用docker ps -a命令查找与hello-world映像关联的容器的容器ID或名称,并将其删除。
docker rm nifty_benz
下面是先用ps -a 查看,rm 后再查看的过程。nifty_benz 是ps 看到的名字,各自不一样。
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd612e776819 ubuntu "/bin/bash" 6 hours ago Exited (0) About a minute ago gallant_visvesvaraya
bdbf06b1c3bc hello-world "/hello" 6 hours ago Exited (0) 5 hours ago nifty_benz
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker rm nifty_benz
nifty_benz
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd612e776819 ubuntu "/bin/bash" 6 hours ago Exited (0) 2 minutes ago gallant_visvesvaraya
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$
可以启动一个新容器,并使用--name开关为其命名。 也可以使用--rm开关创建一个容器,该容器在停止时会自行删除。 有关这些选项和其他选项的更多信息,请参阅docker run help命令。
容器可以转换为映像,可以使用它们来构建新的容器。 让我们看看它是如何工作的。
7:提交对容器的更改
启动Docker映像时,可以像使用虚拟机一样创建,修改和删除文件。 所做的更改将仅应用于该容器。 可以启动和停止它,但是一旦使用docker rm命令销毁它,更改将永远丢失。
本节说明如何将容器状态另存为新的Docker映像。
在Ubuntu容器中安装Node.js之后,现在有了一个运行映像的容器,但是该容器与用于创建它的映像不同。 但是以后可能希望重用此Node.js容器作为新映像的基础。
然后使用以下命令将更改提交到新的Docker映像实例。
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
-m开关用于提交消息,该消息可帮助你和其他人知道你所做的更改,而-a用于指定作者。 container_id是您在本教程前面部分中启动交互式Docker会话时所注明的那个。 除非在Docker Hub上创建了其他存储库,否则该存储库通常是的Docker Hub用户名。
例如,对于sammy 用户,容器ID为d9b100f2f636,命令将为:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
提交映像时,新映像将保存在本地计算机上。 在本教程的后面,将学习如何将映像推送到Docker Hub等Docker 库,以便其他人可以访问它。
再次列出Docker映像将显示新映像,以及旧映像:
docker images
下面是操作过程:
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker commit -m "added Node.js" -a "leon" bd612e776819 leon/ubuntu-nodejs
sha256:e5120a19cee69adfa4ea83f9e97934aa0ba33624ce4230b92a999c4cb4d2f75d
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
leon/ubuntu-nodejs latest e5120a19cee6 About a minute ago 167MB
ubuntu latest f63181f19b2f 4 weeks ago 72.9MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
leon@ubuntu-s-1vcpu-1gb-tor1-01:~$
8:推送Docker Image 到Docker 库
从现有映像创建新映像之后,下一个步是与朋友,Docker Hub上的整个世界或你有权访问的其他Docker库共享该映像。 要将映像推送到Docker Hub或任何其他Docker注册表,必须在其中拥有一个帐户。
第一步是登录账号:
docker login -u docker-registry-username
如果用户名和登录账号不一致时:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
然后推送:
docker push docker-registry-username/docker-image-name
如果用户名为sammy, image为 ubuntu-nodejs 就用下面命令:
docker push sammy/ubuntu-nodejs
9:容器(Ccontainer),映像(Images)的一些命令
列出所有的容器 ID
docker ps -aq
停止所有的容器
docker stop $(docker ps -aq)
删除所有的容器
docker rm $(docker ps -aq)
删除所有的镜像
docker rmi $(docker images -q)
本文通过学习 How To Install and Use Docker on Ubuntu 20.04 而 完成。
介绍到此。