修改下面内容,如果没有就添加
BOOTPROTO="static" #dhcp改为static
ONBOOT="yes" #开机启用本配置
IPADDR=192.168.7.106 #静态IP
GATEWAY=192.168.7.1 #默认网关
NETMASK=255.255.255.0 #子网掩码
DNS1=192.168.7.1 #DNS 配置
修改后的文件
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=184d6253-b749-4f1e-8521-2fc0414a37e8
DEVICE=ens33
ONBOOT=yes
BROADCAST=192.168.106.255
DNS1=192.168.106.1
IPADDR=192.168.106.101
NETMASK=255.255.255.255
GATEWAY=192.168.106.1
使用的时候需要使用root用户进行操作,不然会出现错误
Docker 主要分成3个大部分
使用root账户
yum install -y docker
sudo service docker start
sudo docker run hello-world
systemctl enable docker
usermod -aG docker your_username
层(Layer)其实是AUFS(Advanced Union File System, 一种联合文件系统)中的概念,是实现增量保存于更新的基础。
镜像ID:唯一标示了镜像 TAG : 用于标示来自同一个仓库的不同镜像。
docker pull NAME[:TAG]
docker images
docker tag
例如:
docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
使用inspect + image id
docker inspect 48b5124b2768
使用 -f 来获取其中一项
docker inspect -f {{.Architecture}} 48b5124b2768
搜索远程仓库中共享的镜像,默认搜索Docker Hub 官方仓库的镜像
docker search TERM
-f, --filter=stars=0 指定仅显示评价为指定星级以上的镜像
如果该镜像有多个标签只会删除指定标签,只有一个时会删除所有AUFS层。可以使用名字+版本的方式,也可以使用ImageId(或可识别部分)进行删除,当有容器存在的时候,镜像文件无法删除。
docker rmi IMAGE[IMAGE...]
强制删除使用 -f 参数
docker rmi -f ubuntu
但是这样会存在遗留镜像,正确做法应该是先删除容器再删除镜像,这样会正确打印删除各层信息。
使用Docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令
选项
$ sudo docker run -ti ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit
容器id为a925cb40b3f0
然后提交为一个新的镜像
$ sudo docker commit -m "Added a new file" -a "Docker NewBee" a925cb40b3f0 test
查看本地镜像列表可以看到新创建的镜像
$ sudo docker images
下载压缩包,然后用命令导入
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
然后查询
$ sudo docker images
docker save
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
sudo docker load --input ubuntu_14.04.tar
或
sudo docker load < ubuntu_14.04.tar
默认上传到DockerHub 官方仓库,需要登录,命令格式。
例如user用户上传本地test:latest镜像,可以先添加标签user/test:latest 然后使用docker push
docker push NAME[:TAG]
sudo docker tag test:lastest user/test:latest
sudo docker push user/test:latest
然后输入账号密码
容器是镜像的一个运行实例,带有可写的文件层,镜像创建后不可写。
容器是直接提供应用服务的组件,也是Docker 实现快速的启停和高效服务性能的基础。
docker ps -a
使用docker create 新建的容器处于停止状态可以使用 docker start启动
创建容器
docker create
创建:
docker create -lt ubuntu:latest
查询
docker ps -a
docker run ubuntu /bin/echo 'hello world'
docker run 命令启动时,Docker后台运行标准操作
-t 参数让Docker 分配一个伪终端,并绑定到容器的标准输入
-i 让容器的标准输入保持打开
docker run -t -i ubuntu:14.04 /bin/bash
使用 Ctrl+D 或 exit命令退出
-d Docker容器再后台已守护态形式运行
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
返回一个唯一Id 可以使用 docker ps 查看容器信息
docker ps
获取容器的输出信息 docker logs ID
docker logs 868e548cd38
docker stop [-t|--time[=10]] ID
docker 容器中指定的应用终止时,容器也自动终止。
docker kill 命令会直接发送SIGKILL信号来强行终止容器
查看终止状态的容器ID信息
docker ps -a -q
处于终止状态的容器可以使用docker start 命令来重新启动。
在使用-d 参数容器进入后台,用户无法看到容器中的信息,某些时候需要进入容器进行操作。
后台启动ubuntu( -it 和 /bin/sh 成对出现进行操作)
docker run -itd ubuntu /bin/sh
查看docker进程
docker ps
attach进入ubuntu,
sudo docker attach id/name
exec 进入ubuntu
docker exec -ti id/name /bin/bash
nsenter 工具在util-linux包2.23版本之后包含。如果没有安装如下:
输入 https://www.kernel.org/pub/linux/utils/util-linux/ 可以选择版本
cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.gz | tar -zxf-; cd util-linux-2.29;
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin
为了使用nsenter连接到容器,还需要找到容器的进程的pid
PID=$(docker inspect --format "{{.State.Pid}}" <container id>)
通过pid, 连接容器
nsenter --target $PID --mount --uts --ipc --net --pid
完整使用例子
//启动ubuntu
docker run -idt ubuntu /bin/bash
//查询docker容器id
docker ps
//查询pid并将值赋给PID变量
PID=$(docker inspect --format "{{.State.Pid}}" a86ac85eaa03)
//打印pid
echo $PID
//使用nsenter命令,--target后跟查询出的PID值
nsenter --target 2842 --mount --uts --ipc --net --pid
-f, --force=false 强制终止并删除一个运行中的容器
-l, --link=false 删除容器的连接,但保留容器
-v, --volumes=false 删除容器挂载的数据卷
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm ContainerId
导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。
docker export CONTAINER
具体操作过程
//查看当前容器
docker ps -a
导出ce5542容器到test_for_run.tar 文件
docker export ce5542 > test_for_run.tar
导出的文件可以使用命令导入,成为镜像
docker import
具体操作过程
cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
docker load命令来导入镜像存储文件到本地的镜像库,docker import导入一个容器快照到本地镜像库。
区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(既仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也大。
此外:从容器快照文件导入时可以重新指定标签等元数据信息。
仓库(Respository)是集中存放镜像的地方。
注册服务器(Registry):存放仓库的具体服务器
例如仓库地址 dl.dockerpool.com/ubuntu来说, dl.dockerpool.com是注册服务器地址, ubuntu是仓库名
Docker官方公共仓库https://hub.doker.com
Docker Pool 国内专业的Docker技术社区,也提供镜像http://dockerpool.com
docker login 命令来输入用户名、密码和邮箱来完成注册和登录
注册成功后本地用户目录 .dockercfg中将保存用户的认证信息
查询官方镜像仓库
-s N 参数可以指定仅显示评价为N星以上的镜像
docker search
可镜像资源分为两种
下载官方镜像
docker pull
在docker pool 下载的时候需要添加注册服务器的具体地址
docker pull dl.dockerpool.com:5000/ubuntu:12.04
然后可以使用docker tag将这个标签更改成和官方一致
自动创建(Automated Builds) 功能对于需要经常升级镜像内程序来说十分便捷。自动创建功能使用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发现新的提交,则自动执行创建。
之后可以在Docker Hub 的自动创建页面跟踪每次创建的状态
可以使用官方提供的Registry 镜像来简单搭建一套本地私有仓库环境。
自动下载并启动一个registry容器,创建本地的私有仓库服务
docker run -d -p 5000:5000 registry
默认情况会将仓库创建在容器的/tmp/registry目录下。 可以通过-v参数来将镜像文件存放在本地的指定路径上
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此时本地将启动一个私有仓库服务,监听端口为5000。
本地地址为:10.0.2.2:5000 。
上传
//查看已有镜像
docker images
//docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag ubuntu:14.04 10.0.2.2:5000/test
//上传标记的镜像
docker push 10.0.2.2:5000/test
//curl 查看本地仓库中的镜像
curl http://10.0.2.2:5000/v1/search
结果看到{{"description":"", "name": "library/test"}} 就上传成功了
下载:任意可以访问到10.0.2.2地址的机器
docker pull 10.0.2.2:5000/test
下载后可以使用docker tag 修改为通用标签
用户使用Docker的过程中,往往需要能查看容器内应用产生的数据, 这必然涉及到容器的数据管理操作
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供多种有用特效
类似于linux下对目录或文件进行mount操作
在docker run 命令的时候,使用-v标记可以在容器内创建一个数据卷。多次使用-v标记可以创建多个数据卷。
使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器/webapp目录:
-P 允许外部访问容器需要暴露的端口
docker run -d -P --name web -v /webapp training/webapp python app.py
//注意:这个命令没有运行成功,网上查到的也不行,后续进行修改。
挂载主机src/webapp目录到容器的/opt/webapp目录
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
//ro指定为只读
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
用户可以放置一些程序或数据到本地目录然后在容器内运行和使用。
注意:本地目录必须是绝对路径,如果目录不存在,docker 会自动创建
docker 默认权限是读写(rw),用户可以通过ro指定为只读。
可以从主机挂载单个文件到容器中作为数据卷
//记录容器输入过的命令历史
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注意:直接挂载文件到容器使用vi或者sed --in-place的时候可能会导致inode改变,会导致错误。推荐方式是直接挂载文件所在目录。
用户需要在容器之间共享一些持续更新的数据,最简单的方法是使用数据卷容器。
其实就是一个普通容器,专门用它来提供数据卷供其他容器挂载。
//创建一个dbdata数据卷容器, 并在其中创建一个数据卷挂载到/dbdata
docker run -it -v /dbdata --name dbdata ubuntu /bin/bash
//使用--volumes-from 来挂载dbdata容器中的数据卷例如创建db1和db2两个容器并从dbdata容器挂载数据卷
docker run -it --volumes-from dbdata --name db1 ubuntu /bin/bash
docker run -it --volumes-from dbdata --name db2 ubuntu /bin/bash
//现在这3个容器都挂载到相同的/dbdata 目录 三个容器任何一方在该目录下的写入,其他容器都可以看到
cd /dbdata
touch test
ls
//其他2个里就可以看到创建的test了
使用--volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v
命令来指定同时删除关联容器
可以利用数据卷容器对其中的数据卷进行备份、恢复、以实现数据的迁移。
//备份dbdata数据卷容器内的数据卷, (书上 $(pwd):/backup 如果是root运行会把root挂载上去)
docker run -it --volumes-from dbdata -v /dbdata:/backup --name worker ubuntu /bin/bash
tar cvf /backup/backup.tar /dbdata
注意:这里可能会出现没有权限的情况网上查到的解决方案是:(详细的后面更明白的时候补充)
//su -c "setenforce 0" 这个不起作用
//添加 --privileged=true 这个是可以的
docker run --privileged=true -it --volumes-from dbdata -v /dbdata:/backup --name worker ubuntu /bin/bash
//创建一个带有数据卷的容器dbdata2
docker run -it -v /dbdata --name dbdata2 ubuntu /bin/bash
//创建新容器挂载dbdata2 并使用untar 解压备份文件到所挂载的容器卷
docker run --volumes-from dbdata2 -v /dbdata:backup busybox tar xvf /backup/backup.tar /bin/bash
启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
参数来指定端口映射:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
//启动容器
docker run -d -P training/webapp python app.py
//查看容器的情况,可以看到端口,如49115
docker ps -l
访问宿主机的49115端口即可访问容器内Web应用提供的界面。
可以通过docker logs
查看应用的信息
docker logs -f nostalgic_morse
docker logs daemon_logs 查看容器日志
-f:表示查看实时日志
-t:表示查看日志产生的日期
–tail=n:表示查看从尾部看的n条日志
//hostPort:containerPort 将本地的5000端口映射到容器的5000端口
docker run -d -p 5000:5000 training/webapp python app.py
//默认会绑定本地所有接口上的所有地址,多次-p可以绑定多个端口
docker run -d 5000:5000 -p 3000:80 training/webapp python app.py
// ip:hostPort:containerPort 映射特定地址
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
//使用ip::containerPort 绑定localhost的任意端口到容器的5000端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
//可以使用udp 标记来指定udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
//使用 docker port 来查看端口的配置
docker port nostalgic_more 5000
容器又自己内部网络和ip地址,使用docker inspect + 容器id 可以获取所有的变量值
容器的连接系统除端口映射另一种与容器中应用进行交互的方式。
在源和接收容器间建立一个隧道,接收容器可以看到源容器指定的信息。
连接系统依据容器的名称来执行,所以一个好记的名字就很需要了。
使用 --name 可以自定义容器名
docker run -d -p --name web training/webapp python app.py
//查看是否修改
docker ps -l
注意:如果加 --rm 标记, 容器终止后会立即删除, --rm 和 -d 不能同时使用
使用 --link 参数可以让容器之间安全的进行交互
//name 连接的容器的名称,alias 是这个连接的别名
--link name:alias
//创建一个数据库容器
docker run -d --name db training/postgres
//删除之前的web容器
docker rm -f web
//创建一个新的web容器,并将它连接到db容器
docker run -d -P --name web --link db:db training/webapp python app.py
//查看连接
docker ps
// db容器的names 列有 db, web/db 表明web容器连接到db容器,这允许web容器访问db容器的内容
创建安全隧道,不需要暴露端口到外部网络上,比较安全。
使用env 命令来查看web容器的环境变量
docker run --rm --name web2 --link db:db training/webapp env
除了环境变量,docker 还添加host信息到父容器的/etc/hosts的文件
docker run -t -i --rm --link db:db training/webapp /bin/bash
cat /etc/hosts
// 172.17.0.7 aed84ee32bde
// ...
// 172.17.0.5 db
这里会显示2个hosts信息,
apt-get install -yqq inetutils-ping
ping db
官方ubuntu镜像默认没有安装ping,需要自己安装
用户可以连接多个子容器到父容器,比如连接多个web到db容器上
Dockerfile 是一个文本格式的配置文件,用户可以使用Dockerfile 快速创建自定义镜像
Dockerfile 分为4个部分
# this dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author : docker_user
# Command format Instruction [arguments / command]...
# 第一行必须指定基于的基础镜像
FROM ubuntu
# 维护者信息
MAINTAINER docker_user docker_user@email.com
# 镜像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring mai universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器启动时执行指令
CMD /usr/sbin/nginx
指令的一般格式为 INSTRUCTION arguments 指令包括 FROM、MAINTAINER、RUN 等。
FROM <image> 或 FROM <image>:<tag>
第一个指令必须是FROM指令。同一个Dockerfile 中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)
MAINTAINER <name>
指定维护者信息
//在shell 终端运行,既/bin/sh -c ;
RUN <command>
//使用exec执行。指定使用其他终端可以通过第二种方式实现
RUN ["executable", "param1", "param2"]
//例如:
RUN ["/bin/bash", "-c", "echo hello"]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,命令较长时可以使用 \ 来换行
支持3种格式:
//1. 使用exec执行,推荐
CMD ["executable", "param1", "param2"]
//2. 在/bin/sh种执行,提供给需要交互的应用
CMD command param1 param2
//3. 提供给ENTRYPOINT的默认参数
CMD ["param1", "param2"]
告诉Docker 服务端容器暴露的端口号,供互相练习使用
EXPOSE <port> [<port>...]
//例如
EXPOSE 22 80 8443
启动容器时需要通过"-P",Docker 主机会自动分配一个端口转发到指定端口 使用"-p",则可以指定哪个本地端口映射过来
指定环境变量,会被后续RUN指令使用,并在容器运行时保持
ENV <key> <value>
//例如:
ENV PG_MAJOR 9.3
可以在docker run 使用**-e**参数进行覆盖默认配置:
docker run --net=host -d -p 9999:9999 -e Server_Bind=0.0.0.0:9999 processcache
--net=host :docker运行此模式使用主机的网络(一般主机设置桥接模式)
复制指定<src>到容器中的<dest>. 其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个url,还可以是一个tar文件(自动解压为目录)
ADD <src> <dest>
复制本地主机的<src>(为Dockerfile所在目录的相对目录、文件或目录)为容器中的<dest>。目标路径不存在时,会自动创建。
COPY <src> <dest>
使用本地目录为源目录时,推荐使用COPY.
配置容器启动后执行命令, 并且不可被docker run 提供的参数覆盖。
每个Dockerfile中只有一个ENTRYPOINT, 当指定多个ENTRYPOINT时,只有最后一个生效。
有两种格式
ENTRYPOINT ["executable", "param1", "param2"]
//shell 中执行
ENTRYPOINT command param1 param2
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
VOLUME ["/data"]
指定运行容器时的用户名或UID, 后续RUN也会使用指定用户
USER daemon
当服务不需要管理员权限时, 可以通过该命令指定运行用户。 并且可以在之前创建所需要的用户。
RUN groupadd -r postgres && useradd -r -g postgres postgres
零时获取管理员权限使用gosu,而不推荐用sudo
为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录
WORKDIR /path/to/workidr
可以使用多个WORKDIR命令,后续命令如果参数是相对路径,则会基于之前命令指定路径。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
// 最终为/a/b/c
配置当所创建的镜像作为其他新创建镜像的基础镜像时的操作指令
ONBUILD [INSTRUCTION]
例如:Dockerfile 使用如下内容创建镜像image-A
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /use/local/bin/python-build --dir /app/src
[...]
新镜像Dockerfile中FROM image-A 指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后面添加两句指令
FROM image-A
//等价于
ADD . /app/src
RUN /use/local/bin/python-build --dir /app/src
使用ONBUILD指令镜像,推荐在标签中注明,例如 ruby:1.9-onbuild. (也就是 image-A起名的时候起成这种标注的名字)
编写完Dockerfile后,可以通过docker build
命令来创建镜像
docker build [选项] 路径
该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。
一般建议放置Dockerfile的目录为空目录
通过.dockerignore
文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过" -t " 选项
//指定Dockerfile 所在目录 /tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image
docker build -t build_repo/first_image /tmp/docker_builder/
后续继续补充中。。。。。
Docker技术入门与实战+杨保华,戴王剑,曹亚仑编著+机械工业出版社。