使用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等软件的镜像,我们可以将它们联合起来使用。
从概念上讲,可以这样理解。

暂时先继续。
基本指令
以下是命令的说明。
我犹豫了从哪里开始介绍,但首先从常用的开始。
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镜像进行各种测试)