在 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/

累了。

广告
将在 10 秒后关闭
bannerAds