在 CoreOS 上开始使用 Docker

我终于意识到Docker的便利之处,所以开始用CoreOS做笔记。我正在Mac OS X上操作。请根据您的环境调整diskutil和pbcopy等命令。

将 CoreOS 安装到物理服务器上。

制作安装光盘

    1. 从CoreOS网站下载ISO文件

 

    将ISO文件的磁盘映像复制到USB存储设备上:
diskutil unmountDisk /dev/diskN  # USB メモリをアンマウント
sudo dd if=./coreos_production_iso_image.iso of=/dev/diskN bs=1m  # dd で ISO を USB メモリにコピー
    Installing to Disk

安装

创建 cloud-config创建一个 cloud-config.yml 文件来自定义安装程序的设置,类似于 CentOS 中的 ks.cfg 文件。

创建SSH密钥对coreos_key。

ssh-keygen -t rsa -C anony@foo.bar -f ./coreos_key

将公钥coreos_key.pub的字符串复制到cloud-config.yml中使用。

cat ./coreos_key.pub | pbcopy

创建 cloud-config.yml 文件

touch ./cloud-config.yml
#cloud-config

coreos:
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      command: start

    # タイムゾーンを JST に設定
    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=timezone
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime

    # 固定 IP の設定追加
    - name: 10-static.network
      runtime: false
      content: |
        [Match]
        Name=eno1
        [Network]
        Address=192.168.0.98/24
        Gateway=192.168.0.1
        DNS=192.168.0.1

    # NFS 自動マウントの設定追加
    - name: media-myvolume.mount
      command: start
      content: |
        [Mount]
        What=192.168.0.88:/var
        Where=/media/myvolume
        Type=nfs
        Options=nolock

  update:
    - reboot-strategy: best-effort

ssh_authorized_keys:
    # 管理ユーザー core の公開鍵。coreos_key.pub の文字列を使用
    - ssh-rsa AAAAB3NzaC[...] anony@foo.bar

hostname: coreos  # ホスト名を適当に指定

manage_etc_hosts: localhost  # ローカルの名前解決用
    • Customize with Cloud-Config

 

    • Network Configuration

 

    Mounting Storage

从USB存储设备启动
通过CoreOS的USB存储设备启动计算机。自动登录为core用户。

localhost login: core (automatic login)
CoreOS (stable)
Update Strategy: No Reboots
core@localhost ~ $

确认服务器的 IP 地址。

ip add show
eno1: flags=4163<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
    inet 192.168.0.98 netmask 255.255.255.0 broadcast 192.168.1.255

暂时为核心用户设置密码。

sudo passwd core

使用设定的密码,将创建的 cloud-config.yml 从工作 PC 传输到服务器上。

scp ./cloud-config.yml core@192.168.0.98:~

实际上,安装在服务器上执行以下命令进行安装:

sudo coreos-install -d /dev/sda -C stable -c ~/cloud-config.yml

/dev/sda は環境に合わせて読み変える。

完成安装后重新启动。

sudo reboot

确认连接通过作业的个人电脑,使用SSH密钥coreos_key,确认是否能够通过SSH连接到CoreOS服务器。

ssh -i ./coreos_key core@192.168.0.98

顺便提一下,可以通过更新 /var/lib/coreos-install/user_data 来更改 cloud-config.yml 的设置。如果需要更新设置,请点击此处。

如果连接成功,那么就完成了。之后可以通过 SSH 在这台服务器上运行 Docker。

在Vagrant中运行CoreOS。在解释之前,需要先提醒您:我是用人工智能生成的回答,对于专业性强、技术性较强的问题可能无法完全胜任。再者,我仅以通用普及性的汉语翻译回答问题。所以以下是一个可能的语句:

临时偏离一下,不使用物理服务器,而是使用Vagrant来启动CoreOS的方法也记录下来。

由于CoreOS已经正式发布了Vagrantfile,因此我们可以利用它。

从CoreOS的GitHub存储库中克隆Vagrantfile一套。

git clone https://github.com/coreos/coreos-vagrant.git
cd ./coreos-vagrant

之后只是普通的Vagrant步骤。

vagrant up
vagrant ssh
    Running CoreOS on Vagrant

用Docker容器实现 “你好,世界。”从这里开始讲关于Docker的内容。在CoreOS下通过SSH登录进行操作。

先从简单的 Docker 操作确认开始,从现有容器执行 echo 命令并显示 “你好,世界。”。

获取图像首先,从官方的镜像共享云服务 Docker Hub 上获取 CentOS 的镜像。请提前在 Docker Hub 上注册用户并获取账户。

登录Docker Hub:

docker login

搜索CentOS镜像。

docker search centos
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                              The official build of CentOS.                   764       [OK]       
ansible/centos7-ansible             Ansible on Centos7                              27                   [OK]
tutum/centos                        Centos image with SSH access. For the root...   12                   [OK]
blalor/centos                       Bare-bones base CentOS 6.5 image                8                    [OK]
[...]

由于CentOS是官方镜像的搜索结果中排在最前面,所以请下载最新版本的CentOS(centos:latest)。

docker pull centos:latest

生成容器可以使用以下命令确认从Docker Hub等获取并保存在主机上的镜像列表:

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              7                   8efe422e6104        2 weeks ago         224 MB
centos              centos7             8efe422e6104        2 weeks ago         224 MB
centos              latest              8efe422e6104        2 weeks ago         224 MB

centos のイメージが 3 つ表示されているが、これは IMAGE ID が示す通り同一のイメージ。タグの違いから 3 つ表示されている。

在 CentOS 的最新镜像上尝试执行 echo 命令。

docker run centos:latest echo 'Hello, world.'
Hello, world.

正如上所述,应该返回“Hello, world.”到标准输出。

生成的容器是基于 centos:latest 镜像,执行了 echo ‘你好,世界。’。

在中国,只需一种方法来转述以下内容:即使执行结束了,容器也不会被删除。通过执行以下命令可以看到已经结束但仍然存在的容器。

core@coreos ~ $ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS                       PORTS                                          NAMES
bab4118699d3        centos:7                     "echo 'Hello, world.   7 seconds ago       Exited (0) 6 seconds ago                                                    trusting_elion

直到明确删除之前,它将一直存在。如果要删除,请按照以下方式进行:

core@coreos ~ $ docker rm bab4118699d3
bab4118699d3

在中文中,以互动的方式进行执行。

    Foreground – Run Reference – Docker Documentation
core@coreos ~ $ docker run -i -t --rm=true centos:latest sh
sh-4.2# echo 'Hello, world.'
Hello, world.
sh-4.2# exit
exit
core@coreos ~ $ 

-i (–interactive=true) 標準出力受け付けの維持

-t (–tty=true) 疑似 TTY の割り当て

–rm=true 終了時にコンテナを自動削除

在后台运行

    Detached (-d) – Run Reference – Docker Documentation
core@coreos ~ $ docker run -d centos:latest sh -c "while true; do echo \"Hello, world.\"; sleep 1; done"
ae101d4eb9eaa8cc43a6789fa8752825cb43df8e6e9a11093d44f5ebe61bb96c

-d (–detach=true) コンテナをバックグランドで実行し、コンテナ ID を返す

使用docker ps命令获取后台进程列表。

core@coreos ~ $ docker ps
CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS                    NAMES
ae101d4eb9ea        centos:7                     "\"sh -c 'while true   About a minute ago   Up About a minute                            hungry_shockley

通过指定进程的 NAME,获取 docker logs 的输出日志。

core@coreos ~ $ docker logs hungry_shockley
Hello, world.
Hello, world.
Hello, world.

使用docker stop命令根据进程的名称停止进程。

core@coreos ~ $ docker stop hungry_shockley
hungry_shockley

使用 CONTAINER ID 参数来删除容器:docker rm

core@coreos ~ $ docker rm ae101d4eb9ea
ae101d4eb9ea

使用Dockerfile在现有的CentOS镜像上启动各种进程,并将其保存为自定义镜像。

在 CentOS 容器中尝试启动 Apache 和 SSH。首先,我们尝试在 CentOS 镜像上以交互方式构建自己的环境。

由于centos7在systemctl周围的行为比较困难,所以我们决定在centos6上继续使用传统的service命令。

在CentOS 6上以交互方式启动CentOS 6容器。

docker run -i -t --rm=true centos:centos6 sh

进入交互式 shell 后,已经以 root 用户登录。由于进行了沙箱化处理,因此可以毫不担心权限等问题,放心地使用 root 进行工作。

使用以下步骤设置 Apache 和 SSH 环境:

yum update -y
yum install -y httpd openssh-server

sed -ri "s/^#PermitRootLogin yes/PermitRootLogin yes/" /etc/ssh/sshd_config
sed -ri "s/^PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -ri "s/^ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/" /etc/ssh/sshd_config
sed -ri "s/^UsePAM yes/UsePAM no/" /etc/ssh/sshd_config

mkdir -m 700 /root/.ssh

cat - > /root/.ssh/authorized_keys <<__KEY__
ssh-rsa AAAAB3NzaC[...] anony@foo.bar
__KEY__

chmod 600 /root/.ssh/authorized_keys
chown root:root /root/.ssh/authorized_keys

chkconfig httpd on
chkconfig sshd on

service httpd start
service sshd start

然而,尽管已经进行了到这一步的服务器设置,但由于其被沙盒化,所以无法找到将这些服务器公开给外部的方法…

通过添加docker run时的参数来解决这个问题。

docker run -i -t --rm=true --expose=22,80 -p 10022:22 -p 10080:80 centos:centos6 sh

–expose=PORT コンテナ内で外部公開を許可するポートを指定する。

-p PUBLISHED:EXPOSED コンテナ内部で外部公開を許可されたポート EXPOSED とサーバー上で公開するのに使用する割り当てポート PUBLISHED の対で指定する。

通过这个,可以确认服务器已经启动。

    EXPOSE (incoming ports) – Run Reference – Docker Documentation

形象化关于外部公开的方法,最佳的方式是在一个名为Dockerfile的文件中列举要在容器中执行的命令,而不是即时生成互动式容器。

创建Dockerfile
如果将前面交互式 shell 中执行的内容转换成 Dockerfile 来表示,则会得到以下两个文件。

ssh-rsa AAAAB3NzaC[...] anony@foo.bar
FROM centos:centos6

MAINTAINER Yu I. <yu.inao@facebook.com>

RUN yum update -y
RUN yum install -y httpd openssh-server

RUN sed -ri "s/^#PermitRootLogin yes/PermitRootLogin yes/" /etc/ssh/sshd_config
RUN sed -ri "s/^PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
RUN sed -ri "s/^ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/" /etc/ssh/sshd_config
RUN sed -ri "s/^UsePAM yes/UsePAM no/" /etc/ssh/sshd_config

RUN mkdir -m 700 /root/.ssh
ADD ./authorized_keys /root/.ssh/authorized_keys
RUN chmod 600 /root/.ssh/authorized_keys && chown root:root /root/.ssh/authorized_keys

RUN chkconfig httpd on
RUN chkconfig sshd on

RUN service httpd start
RUN service sshd start

EXPOSE 22 80

CMD [ "/sbin/init" ]

将这2个文件存储到任意目录(此处为myimage)。

./myimage/
├── Dockerfile
└── authorized_keys
    Dockerfile – Docker Documentation

将其编译并转换为镜像写好Dockerfile后,构建并将其镜像化,与之前提到的CentOS等操作系统相同。

构建使用以下命令:

docker build -t myimage ./myimage/

-t (–tag=””) イメージを識別するためのリポジトリ名とタグ名を指定

在完成之后,可以使用以下命令确认已经在主机上注册了图像。

docker images

执行图像只需要在 CentOS 镜像上执行 “docker run -d” 命令即可实现后台运行。

在执行时,必须附加适当的参数以公开容器的端口。

docker run -d -p 10022:22 -p 10080:80 myimage

-p (–publish=[]) ホストの指定ポートでコンテナ内部の指定ポートを公開

如果这是一个HTTP服务器,那么就可以通过以下地址访问:

http://192.168.0.98:10080/

累了。

bannerAds