使用Docker(入门的第一步)

在職場一年前开始使用的Docker,现在已经变成了我们开发服务的基础。使用Docker的原因很简单,即使有服务器更替,也不会受到环境依赖的影响。虽然本来是用于实现微服务的工具。

首先,本次我们将讨论Docker的使用方法。

前提条件中的环境首先,我们需要确定在哪里安装Docker。
这次我们将按照以下方法进行安装。

操作系统:Windows 10
虚拟机(VirtualBox):CentOS 7.5

在已经启动的CentOS7.5虚拟机上安装Docker。

构建虚拟机我会在Windows 10上安装VirtualBox和Vagrant。
关于Vagrant,我之前写了一篇简短的文章,请点击这里查看。
我会在一个合适的目录下进行虚拟机的构建准备工作。
虚拟机的映像将使用bento/centos-7.5。
当前我的环境如下所示。

d:\Virtual Machines\Vagrant\VM Images\flask_restful_sample>vagrant box list
bento/centos-6.9 (virtualbox, 201806.08.0)
bento/centos-7.5 (virtualbox, 201808.24.0)

我希望将来能够在Docker上使用Flask-RESTful创建REST API的示例,所以文件夹名称是这样的。
bento/centos-7.5的版本有些旧了。
首先不考虑任何问题,进行初始化。

d:\Virtual Machines\Vagrant\VM Images\flask_restful_sample>vagrant init bento/centos-7.5
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

为了方便配置,你可以在文件夹中创建一个 Vagrantfile。
暂时先仅修改 IP 地址。

config.vm.network "private_network", ip: "192.168.33.20"

我会先这样做。
此外,这里有一个小趣闻。
默认情况下,IP地址的第3个八位组为33,但它依赖于查看ipconfig时的以下设置。

イーサネット アダプター VirtualBox Host-Only Network #2:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::c8e1:5c75:a9d8:e796%6
   IPv4 アドレス . . . . . . . . . . . .: 192.168.33.1
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:

需要将此处的第三个字节与其余部分相结合。
由于有些人拼写为56,所以请注意一下。

然后开始。

d:\Virtual Machines\Vagrant\VM Images\flask_restful_sample>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/centos-7.5'...

~中略~

    default: Guest Additions Version: 5.2.18
    default: VirtualBox Version: 6.0
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => D:/Virtual Machines/Vagrant/VM Images/flask_restful_sample

我曾经抱着一丝希望,想知道会不会自动更新,但事实并非如此…

d:\Virtual Machines\Vagrant\VM Images\flask_restful_sample>vagrant box list
bento/centos-6.9 (virtualbox, 201806.08.0)
bento/centos-7.5 (virtualbox, 201808.24.0)

因为感到懊恼,所以我先执行了 vagrant destroy,然后在 Vagrantfile 中写入 config.vm.box_version = “201811.25.0” 来重新启动,结果却发现无法使用(´・ω・`)为什么啊(´・ω・`)没办法,只能再次按照以前的方式重新启动。。。

我会一边走一边偏离轨道。

安装Docker终于进入正题了。
说实话,如果按照官方的安装步骤来,没问题。
CentOS的安装步骤在这里。

首先,最方便快捷的方法是成为 root 用户。

[vagrant@localhost ~]$ sudo su
[root@localhost vagrant]# 

由于没有安装旧版本,所以直接进行安装。

[root@localhost vagrant]# yum install -y yum-utils device-mapper-persistent-data lvm2

我要添加存储库。

[root@localhost vagrant]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

轻松安装。

[root@localhost vagrant]# yum install docker-ce

因为已经安装成功,所以应该在服务列表里。

[root@localhost vagrant]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com

嗯,我们已经快速完成了到这里,但请注意,在代理环境下使用Docker需要额外的设置。
只要搜索一下就能立即找到,所以应该没有问题,但根据我的调查,写入Environment=设置的位置有两种模式,哪一种适用取决于环境,因此需要尝试一下。

这次我在家使用个人电脑,所以没有使用任何代理设置,只是普通地启动了。

[root@localhost vagrant]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost vagrant]# systemctl start docker

Docker 的使用方法这是关键的地方。
Docker跟Vagrant Cloud一样,有地方可以发布虚拟机镜像。
那就是Docker Hub。
为了方便使用,我们可以使用Docker Hub上已经发布的镜像或者对其进行修改来进行环境搭建。
Docker的镜像不仅包括操作系统,还包括诸如Nginx和Python等软件的镜像,我们可以将它们联合起来使用。
从概念上讲,可以这样理解。

イメージ図.PNG暂时先继续。

基本指令以下是命令的说明。
我犹豫了从哪里开始介绍,但首先从常用的开始。

Docker 镜像类似于vagrant box list。
您可以查看本地预先准备好的Docker虚拟机映像。
虽然在这里解释还为时过早,但以下是我认为经常使用的参数。

-q : イメージのIDのみ表示します。

查看 Docker 容器列表有一个类似于vagrant global-status的东西…或许是吧?
使用Docker镜像的实例被称为容器。
这个命令用于查看容器的列表。
常用的参数包括以下内容。

-q : コンテナのIDのみ表示します。

-a : 起動中ではないコンテナ(終了したり、起動に失敗したり)も表示することができます。

–filter : 表示するコンテナをフィルタリングします。 –filter name=hoge のように使います。

删除 Docker 容器需要删除无用的容器。
有时候容器可能会保留下来,以便可以重新启动。
不再需要的容器需要使用类似 docker rm {容器的ID} 的方式进行删除。

删除Docker镜像使用docker rmi命令,删除不需要的映像。

运行 Docker因为参数太多了,在这里就省略了。

构建Docker镜像请原谅,现在解释还为时过早…
使用 Dockerfile 命令可以自己创建 Docker 镜像。

停止Docker停止正在运行的 Docker 容器。

docker附加我觉得我从来没有用过。
所以,不需要记住它。

使用Docker exec
进入正在启动的容器的命令。
我认为这是一个在各种情况下都可以使用的深奥命令。

大致上是这样的吧。
这次,要不要试试在 Docker 上运行 CentOS (笑)?

试着使用Docker启动CentOS。首先,要从Docker Hub获取图像,需要按照以下方式操作。
※ 因为平时不常用,所以没有解释,但试着运行了一下结果可行,所以在这里作出说明(笑)。

[root@localhost vagrant]# docker pull centos:centos7
centos7: Pulling from library/centos
a02a4930cb5d: Pull complete 
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:centos7

我已经获取了CentOS 7的镜像。如果运行docker images命令,结果将如下所示。

[root@localhost vagrant]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             1e1148e4cc2c        7 weeks ago         202MB

好吧,让我们使用这个图像来启动一下。

[root@localhost vagrant]# docker run -it centos:centos7 /bin/bash
[root@70a9666f1974 /]# 

我觉得突然就一头雾水了(笑)。
Docker容器在启动时不能保持在没有执行任何操作的情况下。
换句话说,必须始终保持进程处于运行状态。
上述命令的意思如下。

docker run : コンテナを起動する

-it : -i と -t の合わせ技。 -i は、コンテナの標準入力を開きます。-t は、tty(端末デバイス)を使う、と、私の持っている参考書には載っています。意味も分からずつけています(‘A`)

centos:centos7 : 最初の centos は、docker イメージのリポジトリ名です。その次の centos7 は、タグの名前です。

/bin/bash : コンテナ起動時、フォアグラウンドで実行するコマンドを指定しています。ここでは、bash を起動しています。

启动容器后的显示结果

[root@70a9666f1974 /]#

看起来是这样的。
这表明它在容器内。
我们试着执行一下命令。

[root@70a9666f1974 /]# hostname
70a9666f1974
[root@70a9666f1974 /]# ip addr show
bash: ip: command not found
[root@70a9666f1974 /]# ifconfig
bash: ifconfig: command not found
[root@70a9666f1974 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

我完全没有命令…
但是我知道CentOS7.6正在运行。
现在来试试输入“exit”。

[root@70a9666f1974 /]# exit
exit
[root@localhost vagrant]# 

我从集装箱里出来了。我试着看看集装箱的状态。

[root@localhost vagrant]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost vagrant]# 

哎呀,找不到了。
也是理所当然的,因为我使用 docker run 启动的 /bin/bash 进程已经通过 exit 命令结束了,所以容器也被终止了。
如果加上 -a 选项就可以确认了。

[root@localhost vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
70a9666f1974        centos:centos7      "/bin/bash"         12 minutes ago      Exited (0) About a minute ago                       naughty_gates

让我们接下来将此容器保持处于运行状态。

[root@localhost vagrant]# docker start 70a9666f1974

这个命令会重新启动之前停止的容器。
加上 “-i” 选项似乎可以再次输入标准输入,但是为了本次想要进行后台执行,没有添加选项。
根据状态显示如下。

[root@localhost vagrant]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
70a9666f1974        centos:centos7      "/bin/bash"         16 minutes ago      Up About a minute                       naughty_gates

刚刚的容器已经成功恢复。
另外,为了从一开始就以后台方式运行,请按以下方式启动。

[root@localhost vagrant]# docker run -di centos:centos7 /bin/bash
458d8d9871b053ee3d46d72736a7cdd3846108b258c89acc80099a1c2a10f2ca
[root@localhost vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
458d8d9871b0        centos:centos7      "/bin/bash"         2 seconds ago       Up 1 second                             elated_banzai
70a9666f1974        centos:centos7      "/bin/bash"         19 minutes ago      Up 4 minutes                            naughty_gates

通过添加-d选项,可以在不输入标准输入的情况下启动容器。顺便说一下,在启动时我没有添加-t选项,但老实说我不知道它的意思,所以无论添加还是不添加,都可以正常运行。如果不加-i选项,它会启动并立即结束,所以看起来是必要的。可能对于/bin/bash来说,如果不提供标准输入,它就无法持续启动…

接下来是如何在标准输入输入后不结束容器的方法。
还有一种方法是启动容器。

[root@localhost vagrant]# docker run -it centos:centos7 /bin/bash
[root@e250cdae49fe /]# 

启动并进入容器。
在这种状态下,按照顺序按下键盘上的Ctrl + p,Ctrl + q键进行输入。
这样就可以从容器中退出。
退出后,确认状态后,容器仍然处于启动状态。

[root@localhost vagrant]# docker run -it centos:centos7 /bin/bash
[root@e250cdae49fe /]# [root@localhost vagrant]# 
[root@localhost vagrant]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
e250cdae49fe        centos:centos7      "/bin/bash"         About a minute ago   Up About a minute                       epic_allen
458d8d9871b0        centos:centos7      "/bin/bash"         4 minutes ago        Up 4 minutes                            elated_banzai
70a9666f1974        centos:centos7      "/bin/bash"         23 minutes ago       Up 8 minutes                            naughty_gates

我不小心创建了很多容器。
为了一次性结束它们,按照以下方式会更方便。

[root@localhost vagrant]# docker stop `docker ps -q`
e250cdae49fe
458d8d9871b0
70a9666f1974
[root@localhost vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
e250cdae49fe        centos:centos7      "/bin/bash"         2 minutes ago       Exited (137) 3 seconds ago                       epic_allen
458d8d9871b0        centos:centos7      "/bin/bash"         6 minutes ago       Exited (137) 3 seconds ago                       elated_banzai
70a9666f1974        centos:centos7      "/bin/bash"         25 minutes ago      Exited (137) 3 seconds ago                       naughty_gates

只在不会造成问题的情况下使用,将 docker ps -q 的返回值作为 docker stop 的参数传递给它。

删除容器也可以像下面这样一次性完成。

[root@localhost vagrant]# docker rm `docker ps -aq`
e250cdae49fe
458d8d9871b0
70a9666f1974
[root@localhost vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost vagrant]# 

在这个命令中,您可以放心执行,因为正在运行的容器不会被删除。

结束
只踏出了第一步,但已经写得很累了…
下次希望能够解释如何进行docker build。

这篇文章不是关于docker build的,但我写了一个续篇↓
尝试使用Docker(使用Python镜像进行各种测试)

bannerAds