前几天看到 Arch 上的 pacman 非常的好用,但是我在安装 Manjaro 遇到了很多问题。所以就在服务器上尝试一下 Arch。使用 Docker 可以在任意 Linux 内核上运行其他 Linux 发行版。使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!

开始前的准备

我的服务器是 Ubuntu,所以首先安装 Docker。

apt install docker

基本命令

  • 拉取 Arch 镜像。
docker pull archlinux/base

这样就把 Arch 的存储到了本地,可以通过 docker image list 查看所有的本地镜像。

[email protected]:~/docker# docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
arch                v1                  9a4034dda227        3 hours ago         594MB
<none>              <none>              20b81ab423c2        3 hours ago         458MB
nginx               latest              f68d6e55e065        4 days ago          109MB
archlinux/base      latest              98e93880f9b1        4 days ago          458MB
bash                latest              417531d957ab        8 weeks ago         15.2MB
  • 启动一个 Docker 容器

docker run 启动一个 Docker 容器。

在此之前了解镜像和容器之间的关系。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

docker run -it --name arch archlinux/base

-i 是交互模式,-t是开始一个 tty。--name给这个容器命名。后面紧跟着镜像名。

然后将会进入 Arch 的 tty 字符终端。

除此之外,常用的参数还有-d后台运行。

从后台进入容器的 tty 终端则可以用,docker exec -it arch bash

arch是之前的命名,bash是容器内的命令。这里打开一个 shell。

  • 查看容器运行状态

docker ps -a 表示查看所有的容器状态。

[email protected]:~/hugo/quickstart# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
72e8ede0f2c8        archlinux/base      "/usr/bin/bash"          13 seconds ago      Up 12 seconds                              arch
02243150a4a8        archlinux/base      "--name arch"            7 minutes ago       Created                                    reverent_wing
d44d03201e87        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes       0.0.0.0:8080->80/tcp   web
  • 删除一个容器

docker rm 3dd93022c1b2,后面的是容器的 ID,或者名字。

  • 停止一个容器

docker stop arch,也是跟的 ID 或者名字。启动自然不用说了。

  • 保存一个容器至镜像

为什么要保存为镜像?

现在我们定制好了变化,我们希望能将其保存下来形成镜像。

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

使用 docker commitgit commit 一样加入版本库。

[email protected]:~# docker commit --author "Innei" --message "init" a2 arch:v1
sha256:9a4034dda227606da0e621fd448d741d1e4b28137a65069575bccf823581bd65

我们可以在 docker image ls 中看到这个新定制的镜像:

[email protected]:~/docker# docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
arch                v1                  9a4034dda227        3 hours ago         594MB
<none>              <none>              20b81ab423c2        4 hours ago         458MB
nginx               latest              f68d6e55e065        4 days ago          109MB
archlinux/base      latest              98e93880f9b1        4 days ago          458MB
bash                latest              417531d957ab        8 weeks ago         15.2MB
  • 容器内端口映射

内部的容器是一个隔离的环境,若需要开启端口供外界访问则需要开始端口映射。

下面以 Nginx 为例。

# 拉取 nginx
docker pull nginx
docker run --name webserver -d -p 8080:80 nginx

-p开启端口映射,外部端口:内部端口。8080:80表示内部 80 -> 外部 8080。

现在通过外部 IP 访问 8080 端口将会看到: