抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

[toc]

docker 笔记(二)

Docker Data Volume

关闭并重启容器,其数据不受影响; 但删除Docker容器,则其更将会全部丢失;
存在的问题
存储于联合文件系统中,不易于宿主机访问;
容器间数据共享不便;
删除容其数据会全部丢失;
解决方案:”卷(volume)”

“卷”是容器上的一个或多个”目录”,此类目录可绕过联合文件系统,与宿主机上的某目录”绑定(关联)”
Volume 于容器初始化之时即会创建,由base image提供的卷中的数据会于此期间完成复制
Volume 的初衷是独立于容器的生命周期实现数据持久化,因此删除容器时即不会删除卷,也
不会对哪怕未被引用的卷做垃圾回收操作;

Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同;

# docker run --name b2 -it -v /data busybox

打开另一个终端查看Mount信息

# docker inspect b2 
"Mounts": [
            {
                "Type": "volume",
                "Name": "5d2aaa4a60dd5724bed6011c92d71df8eb093de43bae2038c992f746f97f6e7d",
                "Source": "/var/lib/docker/volumes/5d2aaa4a60dd5724bed6011c92d71df8eb093de43bae2038c992f746f97f6e7d/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
# echo "hello container" >> /var/lib/docker/volumes/5d2aaa4a60dd5724bed6011c92d71df8eb093de43bae2038c992f746f97f6e7d/_data/test.html

在容器中查看

/ # cat data/test.html
hello container
/ # echo "test rj" >> data/test.html

在宿主机上查看

# cat /var/lib/docker/volumes/5d2aaa4a60dd5724bed6011c92d71df8eb093de43bae2038c992f746f97f6e7d/_data/test.html
hello container
test rj

当容器退出并删除后,数据依然存在

# docker run --name b2 -it --rm -v /data/volumes/b2:/data busybox
# docker inspect b2 | grep volume
                "/data/volumes/b2:/data"
                "Source": "/data/volumes/b2",

查看inspect元素

# docker inspect -f {{.Mounts}} b2
[{bind  /data/volumes/b2 /data   true rprivate}]

注: 两个容器可以共享同一个存储卷

# docker run -it --name c1 -v /docker/volumes/v1:/data busybox
# docker run -it --name c2 -v /docker/volumes/v1:/data busybox

复制使用其它容器的卷,为docker run 命令使用 —volumes-from选项

# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox 
# docker run -it --name bbox2 --volumes-from bbox1 busybox

docker file

FROM
FROM的指令是最重的一个且必须为Dockefile文件开篇的第一个非注释行,
用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的
运行环境。
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在
docker 主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub
Registry上拉取所需要的镜像文件
如果找不到指定的镜像文件,docker build会返回一个错误信息。

Syntax

FROM [:]或
FROM <resository>@

# vim Dockerfile
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html
# vim index.html 
<h1> ssjinyao httpd server.</h1>
# docker build -t ssjinyaohttpd-img:v0.1-1 ./
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/3 : MAINTAINER "Jinyao <renjin@ssjinyao.com>"
 ---> Running in aa9838facca1
Removing intermediate container aa9838facca1
 ---> 71258688ebeb
Step 3/3 : COPY index.html /data/web/html
 ---> b23d8149125a
Successfully built b23d8149125a
Successfully tagged ssjinyaohttpd-img:v0.1-1

验证

# docker run --name ssjinyao-web1 --rm ssjinyaohttpd-img:v0.1-1 cat /data/web/html/index.html
<h1> ssjinyao httpd server.</h1>

复制目录

FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
# ls
Dockerfile  index.html  yum.repos.d
# docker build -t tinyhttpd:v0.1-2 ./
# docker build -t tinyhttpd:v0.1-2 ./
Sending build context to Docker daemon  26.11kB
Step 1/4 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/4 : MAINTAINER "ssjinayo <renjin@ssjinyao.com>"
 ---> Using cache
 ---> 708bad816b72
Step 3/4 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 758051947b4d
Step 4/4 : COPY yum.repos.d /etc/yum.repos.d/
 ---> a4c01bf4fe8d
Successfully built a4c01bf4fe8d
Successfully tagged tinyhttpd:v0.1-2
# docker run --name tinyweb1 --rm tinyhttpd:v0.1-2 ls /etc/yum.repos.d/
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
CentOS-fasttrack.repo
docker-ce.repo
epel-testing.repo
epel.repo

ADD 指令的使用

# vim Dockerfile
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
# docker build -t tinyhttpd:v0.1-3 ./
Sending build context to Docker daemon  26.11kB
Step 1/5 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/5 : MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
 ---> Using cache
 ---> 708bad816b72
Step 3/5 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 758051947b4d
Step 4/5 : COPY yum.repos.d /etc/yum.repos.d/
 ---> Using cache
 ---> a4c01bf4fe8d
Step 5/5 : ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
Downloading  1.025MB/1.025MB
 ---> 884e8bf3725f
Successfully built 884e8bf3725f
Successfully tagged tinyhttpd:v0.1-3
# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src/
nginx-1.15.5.tar.gz
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
ADD nginx-1.15.5.tar.gz /usr/local/src/
# ls
Dockerfile  index.html  nginx-1.15.5.tar.gz  yum.repos.d
# docker build -t tinyhttpd:v0.1-4 ./
# docker run --name tinyweb --rm tinyhttpd:v0.1-4 ls /usr/local/src
nginx-1.15.5

另外一种写法

# vim Dockerfile
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
WORKDIR /usr/local/src/
ADD nginx-1.15.5.tar.gz ./ #这里的./相当于WORKDIR指定的目录
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.15.5.tar.gz ./src/

VOLUME /data/mysql/
# docker build -t tinyhttpd:v0.1-5 ./
Sending build context to Docker daemon  1.052MB
Step 1/7 : FROM busybox:latest
 ---> e1ddd7948a1c
Step 2/7 : MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
 ---> Running in 206968a461e1
Removing intermediate container 206968a461e1
 ---> acce38db09a6
Step 3/7 : COPY index.html /data/web/html/
 ---> cfac93db1094
Step 4/7 : COPY yum.repos.d /etc/yum.repos.d/
 ---> ccbddff1520b
Step 5/7 : WORKDIR /usr/local/
 ---> Running in 8bbda4faa5a4
Removing intermediate container 8bbda4faa5a4
 ---> 1660db5c8614
Step 6/7 : ADD nginx-1.15.5.tar.gz ./src/
 ---> cfd686660ff8
Step 7/7 : VOLUME /data/mysql/
 ---> Running in e85008cba000
Removing intermediate container e85008cba000
 ---> 529be777da05
Successfully built 529be777da05
Successfully tagged tinyhttpd:v0.1-5
# docker run --name tinweb1 --rm tinyhttpd:v0.1-5 mount | grep data
/dev/mapper/centos-root on /data/mysql type xfs (rw,seclabel,relatime,attr2,inode64,noquota)

EXPOSE 指令使用

EXPOSE 1211/udp 11211/tcp # 启动镜像是要使用-P选项

ENV

用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后其它指令
(ENV,ADD,COPY等)所调用

#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
ENV DOC_ROOT /data/web/html

COPY index.html $DOC_ROOT
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.15.5.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp
# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 printenv # 打印输出环境变量
# docker run --name tinyweb --rm -P -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.1-7 printenv # -e 可以外部更改或指定环境变量的
#Deskription: test image
FROM busybox:latest
MAINTAINER "ssjinyao <renjin@ssjinyao.com>"
# LABEL maintainer="ssjinyao"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.15.5.gz"

#当没有
COPY index.html ${DOC_ROOT: -/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
WORKDIR /usr/local/
#ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp

RUN cd /usr/local/src && \
    tar xvf ${WEB_SERVER_PACKAGE}
FROM busybox
LABEL maintainer="ssjinyao <renjin@ssjinyao.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

# COM /bin/httpd  -f -h ${WEB_DOC_ROOT}
CMD ["/bin/httpd", "-f", "-h ${EWB_DOC_ROOT}"]
ENTRYPOINT /bin/sh -c

Dockerfile Nginx镜像 示例

# mkdir img_nginx
# cd img_nginx
# vim Dockerfile
FROM nginx:1.14-alpine

ARG author="ssjinyao <rejin@ssjinyao.com>"

LABEL maintainer="${author}"

ENV NGX_DOC_ROOT="/data/web/html/"

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

ENTRYPOINT ["/bin/entrypoint.sh"]


# vim index.html
<h1> Dockerfile Nginx Test Page.</h1>

# vim entrypoint.sh
#!/bin/sh
#
cat > /etc/nginx/conf.d/www.conf <<EOF
server {
        server_name ${HOSTNAME};
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGINX_DOC_ROOT:-/usr/share/nginx/html};
}
EOF

exec "$@"
# docker run --name myweb1 --rm -P  -e "PORT=8080" nginx_web:v0.0-1
127.0.0.1 - - [03/Oct/2018:07:43:31 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
127.0.0.1 - - [03/Oct/2018:07:44:01 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"

自建docker-registry

# yum -y install docker-registry
# rpm -ql docker-distribution
/etc/docker-distribution/registry/config.yml
/usr/bin/registry
/usr/lib/systemd/system/docker-distribution.service
/var/lib/registry

注: docker push 客户端默认是https工作的,因此在客户端配置不加密传输

# vim /etc/docker/daemon.json
{
    "registry-mirrors":["https://registry.docker-cn.com"],
    "bip": "10.0.0.1/16",
    "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"],
    "insecure-registries": ["node2:5000"]
}
# docker tag ssjinyao/httpd:v0.1.1.1-2 node2:5000/ssjinayo-web:v0.1.1.1-2
# docker push node2:5000/ssjinayo-web
The push refers to repository [node2:5000/ssjinayo-web]
e6baf59e35e7: Pushed
f9d9e4e6e2f0: Pushed
v0.1.1.1-2: digest: sha256:2f3d6d2f468ee189b4b43ff2b9f99a6e3895d9832b606522176f804cba738037 size: 734

服务端镜像默认保存的路径

# ls /var/lib/registry/docker/registry/v2/repositories/ssjinayo-web
_layers  _manifests  _uploads

私有docker 源pull 使用, 前提也要配置不加密传输

# docker pull node2:5000/ssjinayo-web:v0.1.1.1-2
v0.1.1.1-2: Pulling from ssjinayo-web
Digest: sha256:2f3d6d2f468ee189b4b43ff2b9f99a6e3895d9832b606522176f804cba738037
Status: Downloaded newer image for node2:5000/ssjinayo-web:v0.1.1.1-2

vmware-harbor私有源的安装与使用

vmware/harbor安装
vmware/harbor下载

Resource Capacity Description
CPU minimal 2 CPU 4 CPU is prefered
Mem minimal 4GB 8GB is prefered
Disk minimal 40GB 160GB is prefered
# yum -y install docker-compose
# vim harbor.cfg # 这里根据自己的需求更改配置文件
# vim docker-compose.yml # 
# cd /usr/local/src/harbor
# ./install
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                   PORTS                                                              NAMES
f01090bf5ba1        goharbor/nginx-photon:v1.6.0             "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
7e4849fcb12a        goharbor/harbor-jobservice:v1.6.0        "/harbor/start.sh"       3 minutes ago       Up 3 minutes                                                                                harbor-jobservice
0d8ceb3ec5c0        goharbor/harbor-ui:v1.6.0                "/harbor/start.sh"       3 minutes ago       Up 3 minutes (healthy)                                                                      harbor-ui
c5780037bc8f        goharbor/harbor-adminserver:v1.6.0       "/harbor/start.sh"       3 minutes ago       Up 3 minutes (healthy)                                                                      harbor-adminserver
b184110cfac2        goharbor/registry-photon:v2.6.2-v1.6.0   "/entrypoint.sh /etc…"   3 minutes ago       Up 3 minutes (healthy)   5000/tcp                                                           registry
83b4b2ea3b2e        goharbor/redis-photon:v1.6.0             "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes             6379/tcp                                                           redis
9055f4dcdaeb        goharbor/harbor-db:v1.6.0                "/entrypoint.sh post…"   3 minutes ago       Up 3 minutes (healthy)   5432/tcp                                                           harbor-db
583dd6d3dc30        goharbor/harbor-log:v1.6.0               "/bin/sh -c /usr/loc…"   3 minutes ago       Up 3 minutes (healthy)   127.0.0.1:1514->10514/tcp                                          harbor-log

登录管理员后台

在 docker-vmware-harbor中创建普通用户,在普通用户中创建项目

# vim /etc/docker/daemon.json
{
    "insecure-registries": ["blog.ssjinyao.com"]
}
# docker login blog.ssjinyao.com
Username: ssjinyao
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@ssjinyao-node2:~]# docker push blog.ssjinyao.com/devel/ssjinyao-httpd
The push refers to repository [blog.ssjinyao.com/devel/ssjinyao-httpd]
e6baf59e35e7: Pushed
f9d9e4e6e2f0: Pushed
v0.1.1.1-1: digest: sha256:7248231aa495c62947519646d25acb453fd2caf3ed6bf778b41e6201bd3e31fc size: 734
e6baf59e35e7: Layer already exists
f9d9e4e6e2f0: Layer already exists
v0.1.1.1-2: digest: sha256:2f3d6d2f468ee189b4b43ff2b9f99a6e3895d9832b606522176f804cba738037 size: 734

push 镜像前可以查看vmware-harbor的打标签提示

# docker-compose pause 暂停
# docker-compose unpause 运行
# docker-compose stop 停止
# docker-compose start 启动

docker 资源限制

OOME
一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内
为此,Dokcer特地调整了docker daemon的OOM优先级,以名它被内核”正法”
但容器的优先级并未被调整

—memory-swap —memory 功能
正数S 正数M 容器可用总空间为S,其中ram为M,swap为(S-M)若S=M,则无可用swap资源
0 正数M 相当于未设置 swap(unset)
unset 正数M 若主机(Docker Host)启用了swap,则容器的可用swap为2*M
-1 正数M 若主机(Docker Host)启用了swap,则容器可使用最大至主机上所的所有swap空间的资源
注意: 在容器使用free命令可以看到的swap空间并不是具有其所展现出的空间指示意义

pull 一个压测镜像

# docker pull lorel/docker-stress-ng
# docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --help
# docker run --name stree -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2

查看启用的docker进程

查看stress 容器的分配内存状态

同样的,当对cpu做压测时,指定上限为两个cpu,也就是使用率为200%,当压测为8个cpu时,cpu最高占用为200%

# docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
# docker run --name stress -it --cpuset-cpus 0,2 --rm lorel/docker-stress-ng:latest stress --cpu 8  #设定只运行在第0和2个cpu上
# docker run --name stress -it --cpus 2 --rm lorel/docker-stress-ng:latest stresss --cpu8 #设定cpus 2 ,说明所有核心都能用到,但是最多只能使用200%
# docker run --name stress -it --cpu-shares 1024 --rm lorel/docker-stress-ng:latest stress --cpu 8 
# 设定限制为尽可能多的分配cpu资源,最后这种模式,当再启一个容器时,会实时按比例分配cpu资源分到另一个容器,
# docker run --name stress2 -it --cpu-shares 512 --rm lorel/docker-stress-ng:latest stress --cpu 8

评论