/etc/apt/so" />
搜档网
当前位置:搜档网 › docker笔记

docker笔记

安装docker的步骤:
apt-get update
apt-get install docker.io -y
apt-key adv --keyserver https://www.sodocs.net/doc/738474454.html, --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sh -c "echo deb http://get.docker.io/ubuntu docker main\ >/etc/apt/sources.list.d/docker.list"
apt-get update
apt-get install lxc-docker -y
LXC依赖namespace来实现隔离,使容器互不影响

或者使用安装脚本来安装Docker
curl https://get.docker.io/ | sudo sh

############################################################################################################
镜像下载docker pull ubuntu
镜像搜索docker search
本地镜像查看docker images

sshd容器的创建:
mkdir ssh_ubuntu
在ssh_ubuntu文件夹下touch run.sh Dockerfile authorized_keys


编辑Dockerfile文件
FROM ubuntu:latest //调用本地的ubuntu镜像
//安装ssh服务
RUN apt-get update
RUN apt-get install -y openssh-server //容器中安装openssh
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd //取消pam限制
//复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
//开放端口
EXPOSE 22
//设置自动启动命令
CMD ["/run.sh"]

编辑run.sh脚本
#!/bin/bash
/usr/sbin/sshd -D

创建无密码登陆环境
ssh-keygen -t rsa一路回车
cat ~/.ssh/id_rsa.pub > authorized_keys

创建完成后运行来建立sshd容器
docker build -t sshd:ubuntu . (注意后面的点不可以丢)

使用刚才创建的sshd:ubuntu镜像运行一个容器。直接启动镜像,映射容器的端口22到本地的10122端口
docker run -d -p 10122:22 sshd:ubuntu
9d99791acaf6f85eeba01b0b83a023358d6be609c4bf52b655c7f352ffdb6752
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d99791acaf6 sshd:ubuntu "/run.sh" About a minute ago Up About a minute 0.0.0.0:10122->22/tcp stupefied_bardeen

在宿主机新打开一个终端,连接到新建的容器:
ssh 192.168.1.66 -p 10122

nginx容器的创建
mkdir nginx_ubuntu
在nginx_ubuntu下touch run.sh Dockerfile

编辑dockerfile文件:vim Dockerfile 在sshd_ubuntu镜像为基础下创建
FROM sshd:ubuntu
#RUN apt-get update
#RUN apt-get install -y openssh-server
#RUN mkdir -p /var/run/sshd
#RUN mkdir -p /root/.ssh
#RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
#ADD authorized_keys /root/.ssh/authorized_keys
RUN \
apt-get install nginx -y && \
rm -rf /var/lib/apt/lists/* && \
echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
chown -R www-data:www-data /var/lib/nginx
RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfig

ure -f noninteractive tzdata
ADD run.sh /run.sh
RUN chmod 755 /*.sh
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["/run.sh"]
EXPOSE 22
EXPOSE 80
EXPOSE 443

编辑运行脚本run.sh
#!/bin/bash
/usr/sbin/sshd
/usr/sbin/nginx

启动容器,查看内部的80端口被映射到本地的32770端口:
docker run -d -P nginx_ubuntu:latest
7f7525adb637ee945d3522bd6d585b9b776f612f6e97a374f2453792875113de
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f7525adb637 nginx_ubuntu:latest "/run.sh" About a minute ago Up About a minute 0.0.0.0:32770->22/tcp, 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp dreamy_swartz
9d99791acaf6 sshd:ubuntu "/run.sh" About an hour ago Up About an hour 0.0.0.0:10122->22/tcp stupefied_bardeen

##########################################################################################################################
tomcat容器的创建
mkdir tomcat7.0_jdk1.7
把tomcat-7.0.61 jdk1.7的包解压,并把tar包删除
touch create_tomcat_admin_user.sh Dockerfile run.sh

编辑Dockerfile文件
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install vim
#RUN apt-get install -y openssh-server
#RUN mkdir -p /var/run/sshd
#RUN mkdir -p /root/.ssh
#RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
#ADD authorized_keys /root/.ssh/authorized_keys
RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk
ADD tomcat-7.0.61 /tomcat
ADD jdk /jdk

ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN chmod +x /tomcat/bin/*.sh
EXPOSE 8080
#EXPOSE 22
CMD ["/run.sh"]

编辑run.sh
#!/bin/bash
if [ ! -f /.tomcat_admin_created ];then
/create_tomcat_admin_user.sh
fi
#/user/sbin/sshd -D &
exec ${CATALINA_HOME}/bin/catalina.sh run

编辑create_tomcat_admin_user.sh
#!/bin/bash
if [ -f /.tomcat_admin_created ]; then
echo "Tomcat 'admin' user already created"
exit 0
fi

#generate password
PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random")

echo "=> Creating and admin user with a ${_word} password in Tomcat"
sed -i -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "" >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "=> Done!"
touch /.tomcat_admin_created

echo "============================================================================="
echo "You can now cinfigure to this Tomcat server using:"
echo ""
echo " admin:${PASS}"
echo ""
echo "============================================================================="

创建容器docker build -t tomcat7.0:jdk1.7 .
启动容器docker run -d -P tomcat7.0:djk1.7
1cbe5933ea86b805a621065d8d54977da270143107180273173ecf6c0571fda7
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cbe5933ea86 tomcat7.0:jdk1.7 "/run.sh" 8 minutes ago Up 8 minutes 0.0.0.0:32805->22/tcp, 0.0.0.0:32804->8080/tcp berserk_bell

#######################################################################################################################################
基于容器运行的私有仓库建设:
192.168.1.125 库户端
192.168.1.66 为仓库服务器

下载registry
docker pull registry
启动registry
docker run -d -p 5000:5000 registry映射容器5000端口到宿主机的5000端口上

默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下:

mkdir /date/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

私有仓库已经建立现在需要在客户端上验证

在客户端下载一个小镜像busybox
docker pull busybox

修改busybox的tag为 192.168.1.66:5000/busybox

docker tag busybox 192.168.1.66:5000/busybox

因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务

vim /etc/init/docker.conf

script
# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
DOCKER=/usr/bin/$UPSTART_JOB
DOCKER_OPTS=
if [ -f /etc/default/$UPSTART_JOB ]; then
. /etc/default/$UPSTART_JOB
fi
exec "$DOCKER" -d $DOCKER_OPTS
end script
修改为
script
# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
DOCKER=/usr/bin/$UPSTART_JOB
DOCKER_OPTS=
if [ -f /etc/default/$UPSTART_JOB ]; then
. /etc/default/$UPSTART_J

OB
fi
exec "$DOCKER" -d $DOCKER_OPTS --insecure-registry 192.168.1.66:5000
end script

重启docker :service docker restart

docker push 192.168.1.66:5000/busybox //上传成功提示:
The push refers to a repository [192.168.1.66:5000/busybox] (len: 1)
Sending image list
Pushing repository 192.168.1.66:5000/busybox (1 tags)
cf2616975b4a: Image successfully pushed
6ce2e90b0bc7: Image successfully pushed
8c2e06607696: Image successfully pushed
Pushing tag for rev [8c2e06607696] on {http://192.168.1.66:5000/v1/repositories/busybox/tags/latest}

######################################################################################################################
连接容器并进入
wget https://https://www.sodocs.net/doc/738474454.html,/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar zxf util-linux-2.24.tar.gz
cd util-linux-2.24
./configure --without-ncurses
make && make install
cp nsenter /usr/local/bin
为了连接到容器,你还需要找到容器的第一个进程的PID。
docker inspect --format "{{ .State.Pid }}"

通过这个PID,你就可以连接到这个容器:
nsenter --target $PID --mount --uts --ipc --net --pid
###############################################################################################################################
进入容器
当我们使用-d参数时,容器启动后会进入后台,用户无法看到容器的信息,如果需要进入容器进行操作,有多种方法:docker attach、docker exec及nsenter工具等。
(1) attach命令
命令格式:docker attach #docker自带的命令
[root@cxp ~]# docker attach --help

Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

--help=false Print usage
--no-stdin=false Do not attach STDIN
--sig-proxy=true Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.

docker attach

(2) exec命令
命令格式:docker exec

[root@cxp ~]# docker exec --help

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

-d, --detach=false Detached mode: run command in the background
--help=false Print usage
-i, --interactive=false Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY
##################################################################################################################
本地私有仓服务器
apt-get update
apt-get install build-essential python-dev python-pip libffi-dev liblzma-dev libssl-dev swig -y
git clone https://https://www.sodocs.net/doc/738474454.html,/docker/docker-registry.git
cd docker-registry/
cp config/config_sample.yml config/config.yml
vim config/config.yml
sqlalchemy_index_database:
_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db

将其更改指向/var/docker-registry,如下所示:

sqlalchemy_index_d

atabase:
_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////data/registry/docker-registry.db
向下一点,到local:部分,重复上述操作,更改如下内容:
local: &local
storage: local
storage_path: _env:STORAGE_PATH:/tmp/registry
为:
local: &local
<<: *common
storage: local
storage_path: _env:STORAGE_PATH:/data/registry
python setup.py install
执行gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application 或者docker-registry
#################################################################################################################################
配置脚本
vim /etc/init/docker-registry.conf
description "Docker Registry"

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 10 5

script
exec gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:application
end script
启动私有仓库
docker-registry &
###############################################################################################################################
验证安装成功
curl 127.0.0.1:5000
"\"docker-registry server\""

#################################################################################################################################
用户认证
为了避免任何人都能登陆我们的docker registy服务器,首先要做的就是建立认证机制。
下面安装Nginx和apache2-utils包(通过该包,可以轻松创建Nginx能够读取的权限文件)。
sudo apt-get -y install nginx apache2-utils
现在来创建docker用户。
通过下面的命令来创建第一个用户:
htpasswd -c /etc/nginx/docker-registry.htpasswd USERNAME
现在,我们拥有了一个创建用户的文件dokcer-registry.htpasswd,以及可用的docker registry服务器。如果你想了解你的用户的话你可以随意查看该文件(如果想收回权限的话可以删除掉该用户)。

下面,我们需要告诉Nginx去利用权限文件,并且将请求转发给docker registry。

那么,我们来创建一个Nginx的配置文件。创建一个新的docker-registry文件,必要时可能需要输入执行sudo命令的密码:

sudo nano /etc/nginx/nginx.conf

将如下内容添加到该文件中。注释也包含在其中。更多关于Nginx虚拟主机配置文件的内容,可查阅该教程。

# For versions of Nginx > 1.3.9 that include chunked transfer encoding support
# Replace with appropriate values where necessary
events {
worker_connections 1024;
}

http {
upstream docker-registry {
server localhost:5000;
}

server {
listen 8080;
server_name https://www.sodocs.net/doc/738474454.html,;

# ssl on;
# ssl_certificate /etc/ssl/certs/docker-registry;
# ssl_certificate_key /etc/ssl/private/docker-registry;


proxy_set_header Host $http_host; # required for Docker client sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client IP

client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

# required to avoid HTTP 411: see Issue #1486 (https://https://www.sodocs.net/doc/738474454.html,/dotcloud/docker/issues/1486)
chunked_transfer_encoding on;

location / {
# let Nginx know about our auth file
auth_basic "Restricted";
auth_basic_user_file docker-registry.htpasswd;

proxy_pass http://docker-registry;
}
location /_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v1/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
}
}
激活虚拟主机配置:
sudo service nginx restart
#################################################################################################################
建立ssl连接
到目前为止,我们已经搭建起了registry服务,并且运行在Nginx后面,通过HTTP基础认证机制连接二者。然而,由于连接是未加密的,所以该服务仍然是不安全的。也许你已经主要到了先前创建的Nginx配置文件中被注释掉的关于SSL的部分。
激活SSL。首先,打开Nginx文件以备编辑:

sudo nano /etc/nginx/nginx.conf
找到下述内容:

server {
listen 8080;
server_name https://www.sodocs.net/doc/738474454.html,;

# ssl on;
# ssl_certificate /etc/ssl/certs/docker-registry;
# ssl_certificate_key /etc/ssl/private/docker-registry;

删除SSL行首的#。如果你的服务器有自己的域名的话,将server_name更改为你的域名。完成后应当如下所示:

server {
listen 8080;
server_name https://www.sodocs.net/doc/738474454.html,;

ssl on;
ssl_certificate /etc/ssl/certs/docker-registry;
ssl_certificate_key /etc/ssl/private/docker-registry;

保存该文件。现在,Nginx已经被配置使用SSL,下面将会分别从/etc/ssl/certs/docker-registry和/etc/ssl/private/docker-registry文件中搜索SSL证书和秘钥。
可以免费获得一个签名SSL证书。

或者,使用一个自签名的SSL证书。由于docker当前不允许使用自签名的SSL证书,这将带来加倍的复杂度,因为我们必须去搭建系统来充当我们已具有签名权限的证书。
建立签名证书

首先,创建存放证书的目录并进入该目录:
mkdir ~/certs
cd ~/certs/
生成一个新的根秘钥:
openssl genrsa -out devdockerCA.key 2048
Generating RSA private key, 2048 bit long modulus
................................................................................+++
...............................................+++
e is 65537 (0x10001)

生成一个根证书(跳入命令行时可输入任何内容):
openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt
You are about to be asked to enter info

rmation that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
然后,为服务器生成一个秘钥(稍后会将该文件拷贝到/etc/ssl/private/docker-registry给Nginx使用):
openssl genrsa -out https://www.sodocs.net/doc/738474454.html,.key 2048
Generating RSA private key, 2048 bit long modulus
.............+++
.......................................................+++
e is 65537 (0x10001)
现在,我们必须生成证书签名请求。
在输入下面的OpenSSL命令后,将会跳入命令行模式,需要你输入一些问题的答案。对于前面的一些问题,可随意编辑,但是当要求你键入“Common Name”时,确保输入的是你的服务器的域名。
openssl req -new -key https://www.sodocs.net/doc/738474454.html,.key -out https://www.sodocs.net/doc/738474454.html,.csr

例如,你的docker-registry将以https://www.sodocs.net/doc/738474454.html,为域名运行,然后你的输入应当如下所示:

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:https://www.sodocs.net/doc/738474454.html,
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
切勿输入挑战码。然后,我们需要对证书的请求进行签名:

openssl x509 -req -in https://www.sodocs.net/doc/738474454.html,.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out https://www.sodocs.net/doc/738474454.html,.crt -days 10000
既然我们已生成了所需的证书文件,下面就将它们拷贝到正确的位置。
首先,将证书和秘钥拷贝到Nginx预期的路径:
sudo cp https://www.sodocs.net/doc/738474454.html,.crt /etc/ssl/certs/docker-registry
sudo cp https://www.sodocs.net/doc/738474454.html,.key /etc/ssl/private/docker-registry

由于生成的这些证书并没有得到任何一个著名的证书认证机构(例如,VeriSign)验证,我们需要告诉那些即将连接该docker-registry的客户机,该证书是合法的。我们本地做出上述认证,以便可以在docker-registry服务器上使用docker:
sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert
sudo cp devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert
sudo update-ca-certificates
你可能必须在每一台想要连接该docker-registry的主机上执行上述操作。否则,你将得到SSL错误

并且无法取得连接,这些步骤将在客户端测试小节中再次出现。

SSL测试

重启Nginx以重新载入配置文件和SSL秘钥:

sudo service nginx restart

再次执行curl测试(仅此次使用https)以验证SSL正确工作。必须记住的是,为了让SSL能够正确运行,你必须使用在创建SSL证书的之前,在Common Name域输入的域名。

curl https://USERNAME:PASSWORD@YOUR-DOMAIN:8080

例如,若用户名和密码分别为nik和test,并且SSL证书是为域名https://www.sodocs.net/doc/738474454.html,,那么,你将输入如下的命令:

curl https://nik:test@https://www.sodocs.net/doc/738474454.html,:8080

如果一切顺利的话,你会看到熟悉的内容:

"docker-registry server (dev) (v0.8.1)"

否则,重新检查建立SSL的相关步骤,以及Nginx配置文件,以确保一切正常。

到目前为止,我们已经建立了运行在Nginx服务器后面的docker regsitry,而Nginx通过SSL可以提供权限认证和加密。
第六步——通过其他主机访问docker registry

为了能够访问docker registry,首先要将先前创建的SSL证书添加到新的主机中。该证书文件位于~/certs/devdockerCA.crt。可以选择直接将其复制到新的机器中,或者根据以下说明来进行拷贝粘贴:

在registry服务器上,查看证书:

cat ~/certs/devdockerCA.crt

可得到类似如下的输出:

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTQwOTIxMDYwODE2WhcNNDIwMjA2MDYwODE2WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuK4kNFaY3k/0RdKRK1XLj9+IrpR7WW5lrNaFB0OIiItHV9FjyuSWK2mj
ObR1IWJNrVSqWvfZ/CLGay6Lp9DJvBbpT68dhuS5xbVw3bs3ghB24TntDYhHMAc8
GWor/ZQTzjccHUd1SJxt5mGXalNHUharkLd8mv4fAb7Mh/7AFP32W4X+scPE2bVH
OJ1qH8ACo7pSVl1Ohcri6sMp01GoELyykpXu5azhuCnfXLRyuOvQb7llV5WyKhq+
SjcE3c2C+hCCC5g6IzRcMEg336Ktn5su+kK6c0hoD0PR/W0PtwgH4XlNdpVFqMST
vthEG+Hv6xVGGH+nTszN7F9ugVMxewIDAQABo1AwTjAdBgNVHQ4EFgQULek+WVyK
dJk3JIHoI4iVi0FPtdwwHwYDVR0jBBgwFoAULek+WVyKdJk3JIHoI4iVi0FPtdww
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAkignESZcgr4dBmVZqDwh
YsrKeWSkj+5p9eW5hCHJ5Eg2X8oGTgItuLaLfyFWPS3MYWWMzggxgKMOQM+9o3+k
oH5sUmraNzI3TmAtkqd/8isXzBUV661BbSV0obAgF/ul5v3Tl5uBbCXObC+NUikM
O0C3fDmmeK799AM/hP5CTDehNaFXABGoVRMSlGYe8hZqap/Jm6AaKThV4g6n4F7M
u5wYtI9YDMsxeVW6OP9ZfvpGZW/n/88MSFjMlBjFfFsorfRd6P5WADhdfA6CBECG
LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H
6g==
-----END CERTIFICATE-----

拷贝该输出到粘贴板,并且连接到客户机。

在客户机上,创建证书目录:

sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert

打开证书文件以备编辑:

nano /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt

粘贴证书内容[已在粘贴板上,译者注]。


通过查看给文件来验证证书已保存到客户机上:

cat /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt

如果一切顺利的话,你会看到和之前一样的输出文本:

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
...
...
LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H
6g==
-----END CERTIFICATE-----

现在,更新证书:

sudo update-ca-certificates

会得到形如下文的输出(主要这里的”1 added”)

Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.

如果你到现在还没有安装docker在这台客户机上的,马上安装吧。

在Ubuntu的大多数版本中,你仅需下面这几个命令就能够快速安装最新版的docker。如果你的是其他的发布或者遇到了一些难题,那么你可以查看docker安装指南,以寻其他出路。

添加仓库秘钥:

sudo apt-key adv --keyserver hkp://https://www.sodocs.net/doc/738474454.html,:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9;

创建一个文件来罗列docker仓库:

sudo nano /etc/apt/sources.list.d/docker.list

将以下内容添加到该文件中:

deb https://get.docker.io/ubuntu docker main

更新包列表:

sudo apt-get update

安装docker:

sudo apt-get install -y --force-yes lxc-docker

为了使docker能更快的工作起来,将当前用户加入到docker组中,并且重开一个新的命令行模式:

sudo gpasswd -a ${USER} docker
sudo su -l $USER #(必要时需键入密码)

重启docker以确保其重新载入系统的CA证书。

sudo service docker restart

此时,你应当能够从该客户机登陆docker registry服务器:

docker login https://YOUR-HOSTNAME:8080

注意,此时应当使用https://以及端口8080。输入先前设置的用户名和密码(邮件地址可随意输入)。这时,你应当看到Login Succeeded的成功登陆消息。

此时,docker registry以构建并运行起来。让我们来做个测试的镜像推送到registry上。
第七步——发布到docker registry上

在客户机上,创建一个小的、空的镜像,然后推送到registry上。

docker run -t -i ubuntu /bin/bash

在完成下载之后,你就进入docker命令行模式。对该文件系统做一些小的改变:

touch /SUCCESS

从docker容器中退出:

exit

将所做的更改提交:

docker commit $(docker ps -lq) test-image

如果此时执行docker images命令,你会在镜像列表里,看到已经拥有了一个新的test-image镜像。

# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test-image latest 1f3ce8008165 9 seconds ago 192.7 MB
ubuntu trusty ba5877dc9bec 11 days ago 192.7 MB

此时,该

镜像只存在于本地。那么我们将其推送到新建的registry上。

首先,从docker登陆registry。注意,你要用https://以及8080端口:

docker login https://:8080

输入已设置的用户名和密码:

Username: USERNAME
Password: PASSWORD
Email:
Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it.

docker有一个非同寻常的机制来明确将镜像推送的哪里的registry。必须将镜像打上私有registry路径标签才能实现将其推送上去。那么我们将该镜像打上我们私有registry的标签:

docker tag test-image YOUR-DOMAIN:8080/test-image

注意,先给出镜像的本地名称,然后给出想要将其打成的标签。该标签上不包含https://,仅有域名,端口和镜像名字。

现在可以将镜像推送到registry上了。此时,仅使用标签名:

docker push :8080/test-image

该过程会花费一些时间将镜像上传到registry上。你也会看到包含Image successfully pushed输出消息。
第八步——从docker registry拉取镜像

为了确保一切运行正常,让我们回到初始的服务器上(安装docker regsitry的机器上),将从客户机推送上来的镜像拉取下来。你也可以从第三方的服务器上来测试这一步。

如果在即将测试拉取的服务器上还没有安装docker,回到第六步去参看安装说明(如果是第三方的服务器,那么参看SSL说明一节)。

使用之前创建的用户名和密码登陆:

docker login https://:8080

现在来拉取镜像。仅需要使用打标签的镜像的名字,包括域名,端口号以及镜像名(而没有https://):

docker pull :8080/test-image

docker会执行一些下载任务并回退会命令行模式。如果你在这个新的机器上运行该镜像的话,你会看到之前创建的SUCCESS文件:

docker run -t -i :8080/test-image /bin/bash

罗列文件:

ls

你会看到我们之前创建的SUCCESS文件:

SUCCESS bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

恭喜你!你已经使用私有的docker registry实现了推送和拉取镜像。Happy Docker-ing!!




相关主题