在ubuntu20上安装和使用Docker

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 而 完成。

介绍到此。

猜你喜欢

转载自blog.csdn.net/leon_zeng0/article/details/113881191