该Linux运维笔记纯手打,所有命令都是在学习Linux时总结出来的,包括排版,摒弃用不到的命令,其主要目的是在生产环境中能够快速的定位并查询需要命令的参数,能够高效工作。
1.配置YUM源,此处我们使用阿里源,并安装EPEL源,和Docker相应的依赖.
[root@localhost ~]# rm -fr /etc/yum.repos.d/* [root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo [root@localhost ~]# yum makecache [root@localhost ~]# yum -y install epel-release [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
2.开始安装Docker,并设置开机自启动.
[root@localhost ~]# yum install -y docker-ce [root@localhost ~]# systemctl start docker [root@localhost ~]# systemctl enable docker [root@localhost ~]# docker run hello-world
3.接着配置好阿里云Docker加速器地址.
[root@localhost ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://h8o9al0n.mirror.aliyuncs.com"] } [root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker [root@localhost ~]# docker version
管理Docker镜像
镜像是Docker三大核心概念中最为重要的,自Docker诞生之日起,镜像就是相关社区最为热门的关键词,Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认Docker Hub仓库下载,用户也可以通过配置,使用自定义的镜像仓库.
下面例子将围绕镜像这一核心概念的具体操作,包括如何使用pull命令从Docker Hub仓库中下载镜像到本地,如何查看本地已有的镜像信息和管理镜像标签,如何在远端仓库使用search命令进行搜索和过滤,如何删除镜像标签和镜像文件,如何创建用户定制的镜像并且保存为外部文件.最后,还介绍如何往Docker Hub仓库中推送自己的镜像.
使用docker images命令可以列出本地主机上已有镜像的基本信息,还可以使用条件过滤出你想要看得到的相关镜像文件的信息.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
上面信息的参数解释,在列出的信息中可以看到以下几个字段信息:
REPOSITORY=来自于哪个仓库,比如hello-world仓库.
TAG=镜像标签信息,latest表示不同版本信息.
IMAGE ID=镜像唯一ID号,此处唯一.
CREATED=创建时间信息,镜像最后的更新时间.
SIZE=镜像大小,优秀的镜像往往体积都较小,hello-world很优秀.
其中镜像的ID信息十分重要,它唯一标识了镜像.在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID,比如后期我们要删除一个镜像时无需写出全部镜像ID.
TAG信息用来标记来自同一个仓库的不同镜像,例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,包括13.04、14.04、16.04等标签.
镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和.
实例1: 通过使用-a --all=true|false
参数,列出所有的镜像文件(包括临时文件),默认为否.因为我这里只有一个镜像所以只有这一个啦.
[root@localhost ~]# docker images --all=true REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
实例2: 通过使用--digests=true|false
,列出镜像的数字摘要值,默认为否.
[root@localhost ~]# docker images --digests=true REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE hello-world latest sha256:0add3ace90ecb4adbf7777e9a 4ab4c602aa5e 3 months ago 1.84kB
实例3: 通过使用--quiet=true|false
,仅输出ID信息,默认为否.
[root@localhost ~]# docker images -q 4ab4c602aa5e [root@localhost ~]# docker images --quiet=false REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像.用法为docker search TERM.
实例1: 使用search
搜索一个Centos镜像文件.
[root@localhost ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5048 [OK] ansible/centos7-ansible Ansible on Centos7 119 [OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 102 ......
实例2: 仅显示自动创建的镜像,默认为否.
[root@localhost ~]# docker search --automated=true centos Flag --automated has been deprecated, use --filter=is-automated=true instead NAME DESCRIPTION STARS OFFICIAL AUTOMATED ansible/centos7-ansible Ansible on Centos7 119 [OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 102 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 73 [OK] imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 48 [OK]
实例3: 搜索所有自动创建的评价为1+的带nginx关键字的镜像.
[root@localhost ~]# docker search --automated -s 3 nginx Flag --automated has been deprecated, use --filter=is-automated=true instead Flag --stars has been deprecated, use --filter=stars=3 instead NAME DESCRIPTION STARS OFFICIAL AUTOMATED jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1488 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 663
可以使用docker pull命令直接从Docker Hub镜像源来下载镜像,该命令的格式为docker pull NAME[:TAG].其中NAME是镜像仓库的名称,TAG是镜像的标签,通常情况下,描述一个镜像需要包括"名称+标签".
实例: 通过pull
命令获取一个Centos系统镜像.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker pull centos [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签.
实例: 为Centos镜像添加一个新的mycentos:latest镜像标签.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker tag centos:latest mycentos:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB mycentos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
上图可看到,当再次使用docker images列出本地主机上镜像信息,可以看到多了一个拥有mycentos:latest标签的镜像,细心的你可能注意到,这些mycentos:latest镜像的ID跟centos:latest完全一致,它们实际上指向同一个镜像文件,只是别名不同而已.docker tag命令添加的标签实际上起到了类似链接的作用.
使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等.
[root@localhost ~]# docker inspect hello-world [ { "Id": "sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f", "RepoTags": [ "hello-world:latest" ], "RepoDigests": [ "hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788" ], .....
上面的输出有很多,只不过我这里简单显示了,如果我们只要其中一项内容时,可以使用参数-f
来指定你要打印的数据,例如下面我们来演示一下获取当前镜像的Id这个字段的数据.
[root@localhost ~]# docker inspect -f {{".Id"}} hello-world sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息.注意过长的命令被自动截断了,可以使用前面提到的--no-trunc
选项来输出完整命令.
[root@localhost ~]# docker history centos:latest IMAGE CREATED CREATED BY SIZE COMMENT 1e1148e4cc2c 8 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 8 days ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 8 days ago /bin/sh -c #(nop) ADD file:6f877549795f4798a… 202MB
使用docker rmi命令可以删除镜像,其中IMAGE可以为标签或ID,如果要强制删除可加-f
这个选项.
删除镜像: 通过rmi
命令删除mycentos这个标签.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB mycentos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker rmi mycentos:latest Untagged: mycentos:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
强制删除: 强制删除系统全部镜像.
[root@localhost ~]# docker rmi -f $(docker images -q) Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956 Untagged: hello-world:latest Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
导出操作: 通过save 镜像ID >
导出centos镜像.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker save 1e1148e4cc2c > /root/centos.tar [root@localhost ~]# ls centos.tar
导入操作: 通过load < 文件名
导入centos镜像.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker load < centos.tar [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 1e1148e4cc2c 8 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
[root@localhost ~]# docker info #查询守护进程的系统资源设置 [root@localhost ~]# docker search #仓库镜像的查询 [root@localhost ~]# docker pull #仓库镜像的下载 [root@localhost ~]# docker images #本地镜像的查询 [root@localhost ~]# docker rmi #本地镜像的删除 [root@localhost ~]# docker rmi -f $(docker images -q) #强制删除全部镜像(Image) [root@localhost ~]# docker rmi -f <image id> #强制删除指定镜像(Image) [root@localhost ~]# docker history 镜像名 #查询镜像的分层 [root@localhost ~]# docker save 镜像ID > /root/*.tar #镜像的导出 [root@localhost ~]# docker load < /root/*.tar #镜像的导入
管理Docker容器
下面的例子将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等.
从现在开始,忘掉臃肿的虚拟机吧,对容器进行操作就跟直接操作应用一样简单、快速.Docker容器实在太轻量级了,用户可以随时创建或删除容器.
新建容器: 可以使用docker create命令新建一个容器,使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 9 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker create -it centos:latest 23c881ac33c526e60811978a418be92c6a022c106e6d59d989fb7b932dc3473a [root@localhost ~]# docker start 23c881ac33c5 23c881ac33c5
新建并启动: 除了创建容器后通过start命令来启动,也可以直接新建并启动容器.所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 9 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker run centos:latest
守护态运行: 更多的时候,需要让Docker容器在后台以守护态Daemonized形式运行.此时,可以通过添加-d
参数来实现.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 9 days ago 202MB hello-world latest 4ab4c602aa5e 3 months ago 1.84kB [root@localhost ~]# docker run -itd ubuntu:latest 540fd59ee8899a38c4302d83549bd113ad159064ec41c9475a773cbc0fd2dfb8 [root@localhost ~]# docker run -d centos:latest /bin/sh 505a728a2bed9e96b3e4615c4e528bd55285a856dc201bb50d4ed5c9e0a52566 [root@localhost ~]# docker run -d centos:latest /bin/sh -c "echo hello" 6c8fc14a6637928442b768bee0b2d3af800464192e7fce295f39ccdd91b73572
可以使用docker stop来终止一个运行中的容器,也可以使用docker kill命令干掉一个容器.
stop终止容器: 指定通过stop终止一个容器.
[root@localhost ~]# docker stop 540fd59ee889 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 540fd59ee889 ubuntu:latest "/bin/bash" 6 minutes ago Up 6 minutes festive_liskov [root@localhost ~]# docker stop 540fd59ee889 540fd59ee889
kill终止容器:docker kill命令会直接发送SIGKILL信号来强行终止容器.
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 84da1ad9f06c centos:latest "/bin/bash" 33 seconds ago Up 32 seconds hungry_bhabha [root@localhost ~]# docker kill 84da1ad9f06c 84da1ad9f06c
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作.
这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等.下面分别介绍一下.
attach进入容器: attach是Docker自带的命令,下面我们使用它来进入容器的内部吧.
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 540fd59ee889 ubuntu:latest "/bin/bash" About a minute ago Up About a minute festive_liskov 300560ca1c88 centos:latest "/bin/bash" 3 minutes ago Up 3 minutes ecstatic_raman [root@localhost ~]# docker attach 300560ca1c88 [root@300560ca1c88 /]#
但是使用attach命令有时候并不方便,当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示.当某个窗口因命令阻塞时,其他窗口也无法执行操作了,接着下面的命令就更好一些了.
exec进入容器: Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任意命令.
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 540fd59ee889 ubuntu:latest "/bin/bash" 3 minutes ago Up 3 minutes festive_liskov [root@localhost ~]# docker exec -it 540fd59ee889 /bin/bash root@540fd59ee889:/#
可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互,通过指定-it
参数来保持标准输入打开,并且分配一个伪终端.通过exec命令对容器执行操作是最为推荐的方式.
可以使用docker rm命令来删除处于终止或退出状态的容器.
rm 删除容器: 通过rm -f
命令强制删除一个容器.
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa6110bdb3df centos:latest "/bin/bash" 3 seconds ago Up 2 seconds eager_mirzakhani [root@localhost ~]# docker rm -f fa6110bdb3df fa6110bdb3df
[root@localhost ~]# docker run #容器的创建或启动 [root@localhost ~]# docker run --restart=always #设置容器的自启动 [root@localhost ~]# docker ps #运行中的容器的查询 [root@localhost ~]# docker ps --no-trunc #查看容器状态 [root@localhost ~]# docker start/stop #容器启动/关闭 [root@localhost ~]# docker stop $(docker ps -a -q) #停止所有运行中的容器(Container) [root@localhost ~]# docker rm $(docker ps -a -q) #删除全部容器(Container) [root@localhost ~]# docker start/stop 镜像名 #通过容器别名启动/停止 [root@localhost ~]# docker inspect 镜像名 #查看容器所有基本信息 [root@localhost ~]# docker logs 镜像名 #查看容器日志 [root@localhost ~]# docker stats 镜像名 #查看容器所占用的系统资源 [root@localhost ~]# docker exec 容器名 容器内执行的命令#容器执行命令 [root@localhost ~]# docker exec -it 容器名 /bin/bash #登入容器的bash [root@localhost ~]# docker run -it 容器名 /bin/bash #进入一个镜像
Docker 持久存储
生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作,容器管理中主要有两种方式,数据卷(Data Volumes)
,数据卷容器(Data Volume Containers)
,本小结将首先介绍如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中.接下来,会介绍如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复.
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作.
数据卷可以提供很多有用的特性,如下所示:
● 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便.
● 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作.
● 对数据卷的更新不会影响镜像,解耦了应用和数据.
● 卷会一直存在,直到没有容器使用,可以安全地卸载它.
挂载一个本地目录作为数据卷:
1.在本地主机创建一个目录,并写入一些数据,来模拟本地数据.
[root@localhost ~]# mkdir /data [root@localhost ~]# echo "hello mkdirs.com" > /data/index.html
2.开启容器,并让容器读取本地的/data
目录.
[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /data:/usr/local/apache2/htdocs httpd:latest 2882b3edda42fe153a897d3dc21f73835eb57c14019b5e810066c34e0eda4c0c [参数解释] -d #以守护进程运行 -p #将容器中的80口,映射到本地主机的8080 --name #指定一个容器名称 -v #上面指的是,将本地/data目录挂载得到容器中的/usr/local目录中. -P #是将容器服务暴露的端口,是自动映射到本地主机的临时端口. [root@localhost ~]# curl 127.0.0.1:8080 hello mkdirs.com
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器.数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载.
1.首先,创建一个数据卷容器dbdata,并在容器中创建一个数据卷/dbdata的目录.
[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata centos:latest 1bc16a7978db7db83a4a107bf2fe1c4c42c4c7fffa7dd92372a6aacb68ccfdd0 [root@localhost ~]# docker exec -it dbdata /bin/bash [root@1bc16a7978db /]# echo "hello mkdirs.com" > /usr/local/apache2/htdocs/index.html [root@1bc16a7978db /]# ls -lh /usr/local/apache2/htdocs/index.html total 4.0K -rw-r--r-- 1 root root 17 Dec 15 11:37 index.html [root@1bc16a7978db /]# exit
2.然后,可以在其他容器中使用--volumes-from
来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷.
[root@localhost ~]# docker run -d -p 801:80 --volumes-from dbdata --name db1 httpd:latest 123e75f38947f3294ac77a08bf4380f311d09cc176b576c61499139d75b35db3 [root@localhost ~]# docker run -d -p 802:80 --volumes-from dbdata --name db2 httpd:latest a4e0f8016af6b89e31a637b1482b0849dcea26e4004298def4abce44c84d6dd6
3.分别访问两个不同的端口,会发现网页展现效果是一样的,也就是说,db1和db2共享了dbdata容器里指定文件的内容.
[root@localhost ~]# netstat -antp |grep 801 tcp6 0 0 :::801 :::* LISTEN 3998/docker-proxy [root@localhost ~]# netstat -antp |grep 802 tcp6 0 0 :::802 :::* LISTEN 4157/docker-proxy [root@localhost ~]# curl 127.0.0.1:801 hello mkdirs.com [root@localhost ~]# curl 127.0.0.1:802 hello mkdirs.com
使用--volumes-from
参数所挂载数据卷的容器自身并不需要保持在运行状态,如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除.如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v
命令来指定同时删除关联的容器.
数据备份: 使用下面的命令来备份dbdata数据卷容器内的数据卷,并把它备份到当前目录下.
[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name workers centos:latest tar -czvf /backup/backup.tar /usr/local/apache2/htdocs tar: Removing leading `/' from member names /usr/local/apache2/htdocs/ /usr/local/apache2/htdocs/index.html [root@localhost ~]# ls backup.tar
这个命令稍微有点复杂,具体分析一下,首先利用centos镜像创建了一个容器workers.使用--volumes-from dbdata
参数来让workers容器挂载dbdata容器的数据卷(即dbdata数据卷),使用-v $(pwd):/backup
参数来挂载本地的当前目录到workers容器的/backup目录.workers容器启动后,使用了tar -czvf/backup/backup.tar /usr/local/apache2/htdocs
命令来将/usr/local/apache2/htdocs
下内容备份为容器内的/backup/backup.tar
,即宿主主机当前目录下的backup.tar.
数据恢复: 如果要将数据恢复到一个容器,可以按照下面的步骤操作.
1.首先创建一个带有数据卷的容器dbdata_backup.
[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata_backup centos:latest /bin/bash a207d887bfa07cc0e1737efb197950cac3b2c5647391348b1b8fa8b873c58667
2.然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中.
[root@localhost ~]# docker run --volumes-from dbdata_backup -v $(pwd):/backup busybox tar -xzvf /backup/backup.tar usr/local/apache2/htdocs/ usr/local/apache2/htdocs/index.html
本章介绍了通过数据卷和数据卷容器对容器内数据进行共享、备份和恢复等操作,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可.
Docker 端口映射
在实践中,经常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间有能够互相访问到对方的服务,Docker提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机,另一个是互联机制实现多个容器间通过容器名来快速访问,下面我们来分别介绍一下吧.
随机分配端口: 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P
或-p
参数来指定端口映射.当使用-P(大写的)标记时,Docker会随机映射一个49000~49900
的端口到内部容器开放的网络端口.
[root@localhost ~]# docker run -d -P --name myweb httpd:latest afb211e832c16c80822632fe0864838781cee2132993f93cde8c915e242f9df5 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afb211e832c1 httpd:latest "httpd-foreground" 3 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp myweb
指定分配端口: 当我们使用-p(小写的)
可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器.
[root@localhost ~]# docker run -d -p 8080:80 --name myweb1 httpd:latest b47f6131dea02c8cd22a75049e97c28cc4bb25bc6bf5cd36645c1ccb4210554e #上面说明,将容器的80端口,映射到本地的8080 [root@localhost ~]# curl 127.0.0.1.8080 <html><body><h1>It works!</h1></body></html>
映射指定端口: 格式将容器的80端口映射到本机的80端口.
[root@localhost ~]# docker run -d -p 80:80 --name myweb2 httpd:latest 9c3d0f8ad0bbfa75cc6534f93f959192316125a2776a2c909c71dc9dfb5a8b79 [root@localhost ~]# curl 127.0.0.1 <html><body><h1>It works!</h1></body></html>
映射多个端口: 多次使用-p
标记可以绑定多个端口.
[root@localhost ~]# docker run -d -p 8080:80 -p 1000:21 --name myweb3 httpd:latest 097ceb68128b58195c990dff720e39ca1717809cc2019d3f31466dee6fd32aec [root@localhost ~]# netstat -antp |grep "8080" tcp6 0 0 :::8080 :::* LISTEN 2306/docker-proxy [root@localhost ~]# netstat -antp |grep "1000" tcp6 0 0 :::1000 :::* LISTEN 2317/docker-proxy
映射到指定地址的指定端口: 将容器中的80端口映射到本地指定IP地址上去.
[root@localhost ~]# ifconfig ens32:0 192.168.1.10 netmask 255.255.255.0 [root@localhost ~]# ifconfig ens32:0 ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 ether 00:0c:29:1e:14:e2 txqueuelen 1000 (Ethernet) [root@localhost ~]# docker run -d -p 192.168.1.10:8080:80 --name myweb_port httpd:latest 7385faa5d476cb37dd7d201cd0ec939501c9bdb23ec1c8239245c30d2be9abe7 [root@localhost ~]# netstat -antp |grep "8080" tcp 0 0 192.168.1.10:8080 0.0.0.0:* LISTEN 2585/docker-proxy [root@localhost ~]# curl 192.168.1.10:8080 <html><body><h1>It works!</h1></body></html>
映射到指定地址的任意端口: :本地主机会自动分配一个端口,绑定到容器的80口.
[root@localhost ~]# docker run -d -p 192.168.1.10::80 --name myweb_port1 httpd:latest 7a5a105ae0827aaff68864a28b5f9b8a9592af3551f7deca564ea2d6d5a249b3 [root@localhost ~]# netstat -antp |grep "80" tcp 0 0 192.168.1.10:8080 0.0.0.0:* LISTEN 2585/docker-proxy #还可以使用udp标记来指定udp端口 [root@localhost ~]# docker run -d -p 192.168.1.10:5000:5000/udp --name myweb_udp httpd:latest b9cc6333a63109a70a1d2e645b1ff5046988b472dea3bb4f4d010f1478951adf [root@localhost ~]# netstat -an |grep "5000" udp 0 0 192.168.1.10:5000 0.0.0.0:*
1.首先创建子网
[root@localhost ~]# docker network create --subnet=172.1.0.0/16 mynetwork [root@localhost ~]# docker network ls
2.为容器分配ip
[root@localhost ~]# docker run -itd --name lyshark --net mynetwork --ip 172.1.0.2 centos:latest /bin/bash [root@localhost ~]# docker exec -it lyshark /bin/bash
3.安装各种软件
[root@localhost ~]# yum -y install net-tools passwd openssh-server openssh-clients [root@localhost ~]# passwd root
4.执行ssh生成
[root@localhost ~]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' [root@localhost ~]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' [root@localhost ~]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
5.接着修改sshd_config文件配置信息
[root@localhost ~]# vi /etc/ssh/sshd_config 开启 Port 22 注释 将 PermitRootLogin 的 no 改为 yes 启动ssh服务 /usr/sbin/sshd -D &
6.退出这个镜像,然后打包成新的。
[root@localhost ~]# docker commit lyshark mycentos 制作新的镜像
5.直接创建新的容器即可。
[root@localhost ~]# docker rm $(docker ps -a -q) [root@localhost ~]# docker run -itd --name centos1 --net mynetwork --ip 172.1.0.2 mycentos /usr/sbin/init [root@localhost ~]# docker exec -it lyshark /bin/bash
6.外网链接配置,将外网的5423端口映射到内网主机的 172.1.0.2:22口上,即可外部连接该容器
[root@localhost ~]# firewall-cmd --add-forward-port=port=5423:proto=tcp:toaddr=172.1.0.2:toport=22 success [root@localhost ~]# firewall-cmd --add-port=5423/tcp success
Docker 容器互联
容器的互联(linking)是一种让多个容器中应用进行快速交互的方式,它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址.
1.使用--link
参数可以让容器之间安全地进行交互,下面先创建一个新的MySQL数据库容器.
[root@localhost ~]# docker run -d --name mysqldb mysql:latest c1770a69ed29944466ce013c42ac2a0391651c88381e41be05308eab80458390
2.然后创建一个新的web容器,并将它连接到MySQL容器,使之能够通信.
[root@localhost ~]# docker run -d -P --name web --link mysqldb:mysqldb httpd:latest 8b2bfcbbe00f6966c511fdbbbc16e40736ab8d6aa89d229e224f38d12c4643df
此时,mysqldb容器和web容器建立互联关系,--link
参数的格式为--link name:alias
,其中name是要连接的容器名称,alias是这个连接的别名.
Docker相当于在两个互联的容器之间创建了一个虚机通道,而且不用映射它们的端口到宿主主机上.在启动mysqldb容器的时候并没有使用-p和-P标记,从而避免了暴露数据库服务端口到外部网络上.
FROM centos:latest USER root MAINTAINER lyshark@139.com ENV USER none ENV PASD none
在docker run 命令中通过 -e标记来传递环境变量,这样容器运行时就可以使用该变量:
docker run -it --env "USER=root" \ --env "PASD=1233" df434s4s /bin/bash
查看环境变量
[root@localhost ~]# docker inspect centos:v3 [root@localhost ~]# docker exec -it b2f327865a98 env
Apache是世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中.
1.拉取镜像,并在本地创建一个测试页.
[root@localhost ~]# docker pull httpd:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 2a51bb06dc8b 4 weeks ago 132MB [root@localhost ~]# mkdir /web [root@localhost ~]# echo "hello world" > /web/index.html
2.运行http容器,并访问测试.
[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /web:/usr/local/apache2/htdocs httpd:latest [root@localhost ~]# curl 127.0.0.1:8080 hello world
Gitlab是一款非常强大的开源源码管理系统.它支持基于Git的源码管理、代码评审、issue跟踪、活动管理、wiki页面,持续集成和测试等功能.基于Gitlab,用户可以自己搭建一套类似Github的开发协同平台.
1.安装并启动postgresql.
[root@localhost ~]# docker pull sameersbn/postgresql:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sameersbn/postgresql latest 3c0142eb3992 5 months ago 204MB [root@localhost ~]# docker run --name gitlab_postgresql -d \ --env 'DB_NAME=gitlab' \ --env 'DB_USER=gitlab' --env 'DB_PASS=gitlab' \ sameersbn/postgresql:latest
2.安装redis.
[root@localhost ~]# docker pull sameersbn/redis:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sameersbn/redis latest ad607f019b8c 4 months ago 84.8MB sameersbn/postgresql latest 3c0142eb3992 5 months ago 204MB [root@localhost ~]# docker run --name gitlab_redis -itd sameersbn/redis:latest
3.安装GitLab.
[root@localhost ~]# docker pull sameersbn/gitlab:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sameersbn/gitlab latest 336fe9c19d92 6 days ago 1.96GB sameersbn/redis latest ad607f019b8c 4 months ago 84.8MB sameersbn/postgresql latest 3c0142eb3992 5 months ago 204MB [root@localhost ~]# docker run --name gitlab -d sameersbn/gitlab \ --link gitlab_postgresql:postgresql --link gitlab_redis:redis \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ sameersbn/gitlab:latest
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把WordPress当作一个内容管理系统(CMS)来使用,WordPress逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的.用户可以在支持PHP和MySQL数据库的服务器上使用自己的博客.
1.首先安装一个MariaDB数据库,并配置好初始密码.
[root@localhost ~]# docker pull mariadb:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mariadb latest b468922dbbd7 3 weeks ago 366MB [root@localhost ~]# docker run --name MyDataBase --env MYSQL_ROOT_PASSWORD=example -d mariadb:latest
2.拉取WordPress镜像,并运行,将容器内的80口映射到宿主机的8080口上.
[root@localhost ~]# docker pull wordpress:latest [root@localhost ~]# docker run --name MyWordPress --link MyDataBase:MariaDB -p 8080:80 -d wordpress:latest
Docker 制作镜像
1.拉centos:latest 镜像为基础镜像
[root@localhost ~]# docker pull centos:latest
2.启动并进入容器内部
[root@localhost ~]# docker run -itd --name lamp --net=host centos:latest [root@localhost ~]# docker exec -it lamp /bin/bash
3.安装lamp环境
yum install -y httpd httpd-devel \ mariadb mariadb-server mysql-devel \ php php-mysql php-common php-gd \ php-mbstring php-mcrypt php-devel php-xml
4.写入一下内容.
echo "hello lyshark" > /var/www/html/index.html echo "/usr/sbin/apachectl" >> /etc/bashrc
5.保存镜像,将所退出的容器用commit命令保存为一个新的my_ssh:centos镜像.
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS ebfae6bcd308 centos:latest "/bin/bash" 2 minutes ago Up 2 minutes [root@localhost ~]# docker commit ebfae6bcd308 httpd:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 89cb7bb995ba 4 seconds ago 329 MB docker.io/centos latest 9f38484d220f 2 months ago 202 MB
6.启动容器,并添加端口映射10000–>22.其中10000是宿主主机的端口,22是容器的SSH服务监听端口.
[root@localhost ~]# docker run -itd -p 8080:80 httpd:latest [root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos
1.首先我们要解决Docker容器内不得网络问题.修改DockerDNS,默认没有文件自行创建即可.
[root@localhost ~]# vim /etc/default/docker docker_OPTS="--dns 8.8.8.8 --dns 114.114.114.114" [root@localhost ~]# systemctl restart docker
2.接着在当前目录创建一个Dockerfile文件,和一个index.html文件,文件内容如下.
vim Dockerfile FROM centos:latest // 指定基础镜像 USER root // 以root身份运行 MAINTAINER lyshark@139.com // 个人描述信息 ENV PATH $PATH:/usr/local/nginx/sbin/ // 指定环境变量 RUN yum install -y gcc wget pcre pcre-devel zlib zlib-devel openssl openssl-devel WORKDIR /tmp/ RUN wget http://nginx.org/download/nginx-1.15.12.tar.gz RUN tar -xzf nginx-1.15.12.tar.gz // 解压文件 WORKDIR /tmp/nginx-1.15.12 // 切换默认目录 RUN useradd -s /sbin/nologin -M nginx \ // 编译安装过程 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \ && make \ && make install RUN echo "hello docker" > /usr/local/nginx/html/index.html # COPY ./index.html /usr/local/nginx/html/ // 拷贝文件 EXPOSE 80 // 内部侦听端口 ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log // 镜像入口 #CMD ["/usr/local/nginx/sbin/nginx"] // 作用同上
3.编译镜像文件,并运行镜像
docker build -t nginx:latest . docker run -d -p80:80 nginx:latest
Registry 仓库搭建
Docker Registry工具是Docker内置的私有仓库解决方案,新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+的API,非常适合用来构建私有的镜像注册服务器.官方仓库中也提供了Registry的镜像,因此用户可以通过容器运行和源码安装两种方
式来使用Registry.
实验规划Docker服务器:192.168.1.5
,Docker客户端:192.168.1.25
,请在服务端配置好网桥服务.
1.将本机配置成网桥,使之能够互相通信.
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32 [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 DEVICE=eno16777728 TYPE=Ethernet BOOTPROTO=static BRIDGE=br0 NM_CONTROLLED=yes ONBOOT=yes [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 TYPE=Bridge DEVICE=br0 BOOTPROTO=static IPADDR=192.168.1.15 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=114.114.114.114 ONBOOT=yes [root@localhost ~]# reboot
2.在服务端192.168.1.5
上拉取registry镜像包.
[root@localhost ~]# docker pull registry:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry latest 2e2f252f3c88 3 months ago 33.3MB
3.在服务端192.168.1.5运行docker私有仓库成功执行,则我们的docker私有仓库搭建成功.
[root@localhost ~]# docker run -itd -p 5000:5000 -v /registry:/var/lib/registry --restart=always --privileged=true --name my_registry registry:latest
1.此处我们以hello-world
为例,首先要先把它拉取下来.
[root@localhost ~]# docker pull hello-world:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB
2.其次给hello-world
镜像打个tag表示新的版本,过程中指定服务器IP地址.
[root@localhost ~]# docker tag hello-world 192.168.1.5:5000/hello-world:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.1.5:5000/hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB docker.io/hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB
3.由于docker私有仓库服务器,默认是基于https传输的,所以我们需要在客户端192.168.1.25
做相关设置,禁止使用https传输.
[root@localhost ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"], "insecure-registries":["192.168.1.5:5000"] }
4.依次执行下面两条命令,重新启动docker让其加载我们的配置文件.
[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker [root@localhost ~]# systemctl enable docker
5.执行推送命令,将我们的hello-world
推送到服务器上.
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.1.5:5000/hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB docker.io/hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB [root@localhost ~]# docker push 192.168.1.5:5000/hello-world:latest The push refers to a repository [192.168.1.5:5000/hello-world] 428c97da766c: Pushed latest: digest: sha256:1a6fd470b9ce10849be79e99529a88371dff60c60aab424c077007f6979b4812 size: 524
6.在服务器端查看刚刚提交的一个请求.
[root@localhost ~]# ls -l /registry/docker/registry/v2/repositories total 0 drwxr-xr-x 5 root root 55 Dec 17 20:23 hello-world [root@localhost ~]# curl http://192.168.1.5:5000/v2/_catalog {"repositories":["hello-world"]}
1.客户端修改一下配置文件,指定以下服务器地址.
[root@localhost ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"], "insecure-registries":["192.168.1.5:5000"] }
2.修改Docker配置文件,开启局域网模式.
在/etc/default/docker添加一行: DOCKER_OPTS="--insecure-registry 192.168.1.5:5000" 或在/etc/sysconfig/docker文件中添加 OPTIONS='--selinux-enabled --insecure-registry 192.168.1.5:5000'
3.重新启动Docker,加载配置文件.
[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker [root@localhost ~]# systemctl enable docker
4.通过命令下载测试镜像.
[root@localhost ~]# docker pull 192.168.1.5:5000/hello-world:latest
原文链接:https://blog.csdn.net/lyshark_csdn/article/details/124939259?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168623078216800213057985%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168623078216800213057985&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-25-124939259-null-null.268%5Ev1%5Ekoosearch&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81