在 CoreOS 上开始使用 Docker
我终于意识到Docker的便利之处,所以开始用CoreOS做笔记。我正在Mac OS X上操作。请根据您的环境调整diskutil和pbcopy等命令。
将 CoreOS 安装到物理服务器上。
制作安装光盘
-
- 从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/
累了。