赞
踩
[root@docker02 ~]#docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 3992 [OK]
ansible/centos7-ansible Ansible on Centos7 105
列表说明:
NAME
:镜像名称DESCRIPTION
:镜像说明STARS
:点赞数量OFFICIAL
:是否是官方的AUTOMATED
:是否是自动构建的格式:docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest
标签
根据镜像名称拉取镜像
[root@docker02 ~]#docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading 34.65MB/73.67MB
查看当前主机镜像列表
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
拉第三方镜像方法
docker pull index.tenxcloud.com/tenxcloud/httpd
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz
导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz
e15afa4858b6: Loading layer 215.8MB/215.8MB
Loaded image: centos:latest
格式1:docker rmi 仓库名称:标签
当一个镜像有多个标签时,只是删除其中指定的标签
格式2: docker rmi 镜像ID [-f]
如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
[root@docker01 ~]# docker image rm centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a4339aadd 5 weeks ago 108MB
镜像下载后默认存放在 /var/lib/docker
REPOSITORY
: 镜像所属仓库TAG
: 镜像的标签信息,标记同一个仓库中的不同镜像IMAGE ID
:镜像的唯一ID号,唯一标识一个镜像CREATED
: 镜像创建时间SIZE
: 镜像大小为本地镜像添加新的标签
格式:docker tag 名称:[ 标签]
[root@docker01 ~]# docker image inspect centos
格式:docker save -o 存储文件名 存储的镜像
[root@localhost ~]# docker save -o /opt/nginx.tar nginx:latest
#将本地镜像传给另一台主机
[root@localhost ~]# scp /opt/nginx.tar 192.168.1.54:/opt
容器保存为镜像
[root@jeames ~]# docker images
[root@jeames ~]# docker ps -a
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
[root@jeames ~]# docker commit redis myredis
##使用新的镜像创建容器
docker run -di --name myredis myredis
镜像的备份
[root@jeames ~]# docker save -o myredis.tar myredis
默认放到当前目录
[root@jeames ~]# ll
[root@jeames ~]# pwd
恢复过程
##删除容器
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
docker stop myredis
docker rm myredis
##删除镜像
docker images
docker rmi myredis
[root@jeames ~]# docker load -i myredis.tar
官方构建dockerffile文件参考:https://github.com/CentOS/CentOS-Dockerfiles
dockerfile
主要组成部分:
基础镜像信息 FROM centos:6.8
制作镜像操作指令RUN yum insatll openssh-server -y
容器启动时执行指令 CMD [“/bin/bash”]
dockerfile常用指令:
FROM
:这个镜像来源于哪里(指定基础镜像)MAINTAINER
:告诉别人,谁负责养它(指定维护者信息,可以没有)RUN
:构建镜像时运行的指令ADD
:ADD
指令和 COPY
的使用格类似(同样需求下,官方推荐使用 COPY)<源文件>
为 tar
压缩文件的话,压缩格式为 gzip, bzip2
以及 xz
的情况下,会自动复制并解压
到 <目标路径>
tar
压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定COPY
:等同于上述ADD效果COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
ADD
和COPY
一起时,优先使用COPY
命令ADD
除了COPY
功能还有解压功能WORKDIR
:指定工作目录。WORKDIR
指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR
会建立目录。docker build
构建镜像过程中的,每一个 RUN
命令都是新建的一层。只有通过 WORKDIR
创建的目录才会一直存在WORKDIR <工作目录路径>
VOLUME
:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,在启动容器 docker run
的时候,我们可以通过 -v
参数修改挂载点VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE
:声明端口docker run -P
时,会自动随机映射 EXPOSE
的端口USER
:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。USER <用户名>[:<用户组>]
HEALTHCHECK
:用于指定某个程序或者指令来监控 docker
容器服务的运行状态HEALTHCHECK [选项] CMD <命令>
:设置检查容器健康状况的命令HEALTHCHECK NONE
:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令HEALTHCHECK [选项] CMD <命令>
: 这边 CMD
后面跟随的命令使用CMD
:CMD
指令指定的程序可被 docker run
命令行参数中指定要运行的程序所覆盖。注意
:如果 Dockerfile
中如果存在多个 CMD
指令,仅最后一个生效RUN
指令,用于运行程序,但二者运行的时间点不同:
CMD
在docker run
时运行RUN
是在 docker build
ENV
:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ONBUILD
:用于延迟构建命令的执行。简单的说,就是 Dockerfile
里用 ONBUILD
指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build
)。当有新的 Dockerfile
使用了之前构建的镜像 FROM test-build
,这时执行新镜像的 Dockerfile
构建时候,会执行 test-build
的 Dockerfile
里的 ONBUILD
指定的命令。ONBUILD <其它指令>
LABEL
:LABEL
指令用来给镜像添加一些元数据(metadata
),以键值对的形式,语法格式如下:LABEL <key>=<value> <key>=<value> <key>=<value> ...
ARG
:构建参数,与 ENV
作用一致。不过作用域不一样。ARG
设置的环境变量仅对 Dockerfile
内有效,也就是说只有 docker build
的过程中有效,构建好的镜像内不存在此环境变量。docker build
中可以用 --build-arg <参数名>=<值>
来覆盖。ENTRYPOINT
:容器启动时运行的命令CMD
指令,但其不会被 docker run
的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT
指令指定的程序。但是,如果运行 docker run
时使用了 --entrypoint
选项,将覆盖 ENTRYPOINT
指令指定的程序。docker run
的时候可以指定 ENTRYPOINT
运行所需的参数。注意
:如果 Dockerfile
中如果存在多个 ENTRYPOINT
指令,仅最后一个生效。CMD
命令使用,一般是变参
才会使用 CMD
,这里的 CMD
等于是在给 ENTRYPOINT
传参FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
注意
:每一个指令都会在镜像上创建一个新的层,每一个指令的 前缀都必须是大写
创建第一个Dockerfile文件
# 创建目录
[root@docker01 base]# cd /opt/base
# 创建Dcokerfile文件,注意大小写
[root@docker01 base]# vim Dockerfile
FROM centos:6.8
RUN yum install openssh-server -y
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/usr/sbin/sshd","-D"]
构建docker镜像
[root@docker01 base]# docker image build -t centos6.8-ssh .
-t 为镜像标签打标签 . 表示当前路径
使用自构建的镜像启动
[root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
Dockerfile文件内容
FROM centos:6.8
RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
# 设置工作目录,之后的操作都在这个目录中
WORKDIR /var/www/html/
RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
docker hub
共有镜像发布
docker
提供了一个类似于github
的仓库docker hub
,官方网站(需注册使用)https://hub.docker.com/
注册docker id后,在linux中登录dockerhub
docker login
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
语法是:docker tag 仓库名 peng104/仓库名
docker tag chaoyu/centos-vim peng104/centos-vim
推送docker image 到dockerhub
docker push peng104/centps-cmd-exec:latest
去dockerhub中检查镜像
先删除本地镜像,然后再测试下载pull 镜像文件
docker pull peng104/centos-entrypoint-exec
docker hub
是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry
官方提供的私有仓库
用法详解:https://yeasy.gitbooks.io/docker_practice/repository/registry.html
1.下载一个docker官方私有仓库镜像 docker pull registry 2.运行一个docker私有容器仓库 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry -d 后台运行 -p 端口映射 宿主机的5000:容器内的5000 -v 数据卷挂载 宿主机的 /opt/data/registry :/var/lib/registry registry 镜像名 /var/lib/registry 存放私有仓库位置 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制 3.修改docker的配置文件,让他支持http方式,设置信任,上传私有镜像, vim /etc/docker/daemon.json 写入如下内容 { "registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries":["192.168.11.37:5000"] } 4.修改docker的服务配置文件 vim /lib/systemd/system/docker.service 找到[service]这一代码区域块,写入如下参数 [Service] EnvironmentFile=-/etc/docker/daemon.json 5.重启docker服务 systemctl restart docker 注意:重启docker服务,所有的容器都会挂掉 6.修改本地镜像的tag标记,往自己的私有仓库推送 docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-hello
1、安装加密工具
[root@docker01 clsn]# yum install httpd-tools -y
2、设置认证密码
mkdir /opt/registry-var/auth/ -p
htpasswd \-Bbn clsn 123456 > /opt/registry-var/auth/htpasswd
3、启动容器,在启动时传入认证参数
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
4、使用验证用户测试
# 登陆用户 [root@docker01 ~]# docker login 10.0.0.100:5000 Username: clsn Password: 123456 Login Succeeded # 推送镜像到仓库 [root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox The push refers to repository [10.0.0.100:5000/clsn/busybox] 4febd3792a1f: Pushed 1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527 #认证文件的保存位置 [root@docker01 ~]# cat .docker/config.json { "auths": { "10.0.0.100:5000": { "auth": "Y2xzbjoxMjM0NTY=" }, "https://index.docker.io/v1/": { "auth": "Y2xzbjpIenNAMTk5Ng==" } }, "HttpHeaders": { "User-Agent": "Docker-Client/17.12.0-ce (linux)" } }
至此,一个简单的docker镜像仓库搭建完成
容器管理
[root@docker01 harbor]# pwd
/opt/harbor
[root@docker01 harbor]# docker-compose stop
1、安装docker、docker-compose
下载 harbor
cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xf harbor-offline-installer-v1.3.0.tgz
2、修改主机及web界面密码
[root@docker01 harbor]# vim harbor.cfg
···
hostname = 10.0.0.100
harbor_admin_password = test
···
3、执行安装脚本
[root@docker01 harbor]# ./install.sh
浏览器访问 http://10.0.0.11
添加一个项目
4、镜像推送到仓库的指定项目
[root@docker02 ~]# docker tag centos:6.8 10.0.0.100/clsn/centos6.8:1.0
[root@docker02 ~]#
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 5b0d59026729 8 days ago 1.15MB
10.0.0.100/clsn/centos6.81.06704d778b3ba 2 months ago 195MB
centos 6.86704d778b3ba 2 months ago 195MB
[root@docker02 ~]# docker login 10.0.0.100
Username: admin
Password:
Login Succeeded
5、推送镜像
[root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8
The push refers to repository [10.0.0.100/clsn/centos6.8]
e00c9229b481: Pushing 13.53MB/194.5MB
6、在web界面里查看
参考文献:
https://mp.weixin.qq.com/s/8Dt_negpFfecJRsgWwWfsA
https://mp.weixin.qq.com/s/oujJYbWITT_5pqoDDyxKPw
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。