Docker入门与实战详细笔记

来源:互联网 发布:linux zip 解压乱码 编辑:程序博客网 时间:2024/06/08 16:55

一、镜像

1.1、获取镜像

命令: docker pull NAME[:TAG]例: docker pull centos 相当于 docker pull centos:latest 相当于 docker pull registry.hub.docker.com/centos:latestregistry.hub.docker.com是默认的注册服务器(Docker Hub)

1.2、查看镜像信息

命令:docker imagesdocker tag 为本地镜像添加新的标签例:docker tag dl.dockerpool.com:5000/centos:latest centos:latestdl.dockerpool.com:5000/centos:latest和centos:latest指向同一个镜像docker inspect 获取镜像的详细信息例:① docker inspect 5506de2b643b ② docker inspect –f {{“.NetworkSettings.IPAddress”}} 550

1.3、搜索镜像

命令:docker search例: docker search mysql

1.4、删除镜像

命令:docker rmi IMAGE IMAGE可以是标签或ID

1.5、创建镜像

创建镜像的方法有三种:⑴基于已有镜像的容器创建,⑵基于本地模板导入,⑶基于Dockerfile创建⑴、docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]主要选项:-a, --author=”” 作者信息-m, --message=”” 提交消息-p, --pause=true 提交是暂停容器运行例:docker commit –m “Added a new file” –a “Docker Newbee” a925cb40b3f0 test⑵、docker import例:cat my_container.tar |docker import - image_name:tag docker export <CONTAINER ID> > my_container.tardocker export 命令,导出容器快照到本地文件

1.6、存出和载入镜像

命令: docker save(存出)和docker load(载人) 例:docker save –o ubuntu_14.04.tar ubuntu:14.04docker load –input ubuntu_14.04.tar 或 docker load < ubuntu_14.04.tardocker load 来导入镜像存储文件到本地镜像库docker import 来导入一个容器快照到本地镜像库容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)从容器快照文件导入时可以重新指定标签等元数据信息镜像存储文件将保存完整记录,体积也要大

1.7、上传镜像

镜像默认存储在/var/lib/docker命令:docker push NAME[:TAG]例:docker push user/test:latest

二、容器

2.1、创建容器

命令:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]docker start [OPTIONS] CONTAINER [CONTAINER...]docker run [OPTIONS] IMAGE [COMMAND] [ARG...]创建的容器处于体质状态,使用docker start 启动它docker run 等价于 docker create ,docker start例:docker create –it ubuntu:latestdocker run –it ubuntu:14.04 /bin/bashCtrl+d 或输入exit退出容器docker logs [OPTIONS] CONTAINER 获取容器的输出信息

2.2、终止容器

命令:docker stop [OPTIONS] CONTAINER [CONTAINER...]-t|--time[=10]] 首先发送SIGTERM信号,等待一段时间后再发送SIGKILL信号终止容器docker kill 直接发送SIGKILL信号来强行终止容器例: docker stop ce5docker start ce5docker restart ce5

2.3、进入容器

进入容器有多种方法:⑴docker attachdocker execnsenterdocker attach [OPTIONS] CONTAINER 多个窗口同时attach到同一个容器是,所有窗口都会同步显示docker exec –ti 6e5542159db4 /bin/bashPID=$(DOCKER INSPECT –F “{{.State.Pid}}” <container>)nsenter --target $PID --mount --uts --ipc --net --pid

2.4、删除容器

命令:docker rm [OPTIONS] CONTAINER [CONTAINER...]例:docker rm 6e5542159db4 删除运行中的容器,添加-f

2.5、导入和导出容器

导出容器:导出一个已经创建的容器到一个文件命令:docker export [OPTIONS] CONTAINER例:docker export ce5 >test_for_run.tar将文件传输到其他机器上,通过导入命令实现容器的迁移导入容器:导入文件为镜像例:cat my_container.tar |docker import - image_name:tag

三、仓库

登录命令:docker login docker run –d –p 5000:5000 –v /opt/data/registry:/tmp/registry registry

Start your registry

docker run -d -p 5000:5000 --name registry registry:2Pull (or build) some image from the hubdocker pull ubuntuTag the image so that it points to your registrydocker tag ubuntu localhost:5000/myfirstimagePush itdocker push localhost:5000/myfirstimagePull it backdocker pull localhost:5000/myfirstimageNow stop your registry and remove all datadocker stop registry && docker rm -v registry

四、数据管理

4.1、数据卷

在用docker run 命令的时候,使用-v 可以再容器内创建一个数据卷,多次使用可创建多个数据卷例:①、创建数据卷docker run -dp --name web -v /webapp ubuntu:14.04docker inspect -f {{.Volumes}} $CONTAINER_ID 可查看数据卷对应的主机上的文件②、挂载一个主机目录作为数据卷docker run -dp --name web -v /src/webapp:/opt/webapp ubuntu:1404上面这条命令加载主机/src/webapp目录到容器的/opt/webapp目录docker run -dp --name web -v /src/webapp:/opt/webapp:ro ubuntu:14.04加了:ro之后,容器内挂载的数据卷的数据就无法修改。docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu:14.04这样就可以记录在容器输入过的命令历史(不同shell版本有所不同) 4.2、数据卷容器

4.2、数据卷容器

①、创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdatadocker run -ti -v /dbdata --name dbdata ubuntu:14.04②、创建db1和db2两个容器,并从dbdata容器挂载数据卷docker run -ti --volumes-from dbdata --name db1 ubuntu:14.04docker run -ti --volumes-from dbdata --name db2 ubuntu:14.04③、可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷docker run -d --name db3 --volumes-from db1 ubuntu:14.04#注意:使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态

4.3利用数据卷容器迁移数据

①、备份docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdataa.首先利用ubuntu镜像创建了一个容器worker。b.使用–volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);c.使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录worker容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。②、恢复docker run -v /dbdata --name dbdata2 ubuntu:14.04docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

五、网络基础配置

5.1、端口映射实现访问容器

①、通过-P或-p指定端口映射, -P 随机映射一个49000~49900的端口,-p可以指定要映射的端口

5.2、容器互联实现容器间通信

--link 参数可以让容器之间安全的进行交互 –link name:alias例:docker run –d –P –name web –link db:db training/webapp python app.py db为容器的名字

六、使用Dockerfile 创建镜像

6.1、基本结构

Dockerfile分为四部分: ①基础镜像信息, ②维护者信息, ③镜像操作指令,④容器启动时执行指令

6.2、指令

FROM:格式为 FROM<image> 或 FROM<image>:<tag>第一条指令必须是FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。MAINTAINER:格式为MAINTAIER<name>,指定维护者信息。
RUN:格式为RUN <command>或者RUN [“executable”,“param1”,“param2”]。前者将在shell终端中运行的命令,即/bin/sh–c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如RUN[“/bin/bash”,“-c”,“echohello”]。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。
CMD:支持三种格式:CMD [“executable”,“param1”,”param2”] 使用exec 执行,推荐方式CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用。CMD [“param1”,”param2”] 提供给ENTRYPOINT的默认参数指定容器启动后执行的命令,一般都是早就写好的脚本,例如:CMD[“/run.sh”]。注意:如果Dockerfile中指定了多条命令,只有最后一条会被执行。如果用户启动时候加了运行的命令,则会覆盖掉CMD指定的指令。
EXPOSE:格式为:EXPOSE <port> [<port> …]告诉Docker服务端容器需要暴露的端口号,供互联系统使用。在启动容器时需要通过-P(注意是大写),Docker主机会自动分配一个端口转发到指定的端口;使用-p,则可以具体指定哪个本地端口映射过来。
ENV:格式为:ENV <key> <value> 指定一个环节变量,会被后续的RUN指令使用,并在容器运行时保持
ADD:格式:ADD  <src> <dest> 将复制指定的的文件复制到容器中。src必须为Dockerfile所在位置的相对路径,也可以是一个URL;还可以是一个tar文件(自动解压为目录)
COPY:格式为: copy <src> <dest> 复制本地主叫的<src>(为Dockerfile所在位置的相对路径,文件或目录)为容器中的<dest>.目标路径不存在时,会自动创建。当使用本地目录为源目录时,推荐使用COPY
ENTRYPOINT:有两种格式:ENTRYPOINT [“executable”, “param1”,”param2”]ENTRYPOINT command param1 param2(shell 中执行)配置容器启动后执行的命令,并且不可被docker run 提供的参数覆盖。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。和CMD相似,却有不同。
USER:格式:USER daemon指定运行容器时的用户名或者UID,后续的RUN也会使用指定的用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。要临时获取管理员权限的时候要使用gosu,不推荐使用sudo。如果不指定,容器默认是root运行。
WORKDIR:格式为: WORKDIR /path/to/workdir为后续的RUN,CMD,ENTRYPOINT指令配置工作目录可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
ONBUILD:配置当所创建的镜像作为其他新创建景象的基础镜像时,所执行的操作指令。例如,Dockerfile使用如下内容创建了镜像image-A[…]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build –dir /app/src[…]FROM image-A#自动添加ADD . /app/srcRUN /usr/local/bin/ python-build–dir/app/src

6.3、创建镜像

命令:docker build例:docker build –t build_repo/first_image /tmp/docker_builder/指定Dockerfile 所在路径为/tmp/docker_builder/, 并且希望生产镜像标签为build_repo/first_image
网络基础参考

网桥是在数据链路层,将两个LAN连接起来,根据MAC地址来转发帧,可以看作低层的路由器。

桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发

交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。交换机是一种基于MAC地址识别,能完成封装转发数据包功能的网络设备。交换机可以学习”MAC地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址。

关闭网桥: ip link set br-79ea889a5ac8 down

删除网桥: brctl delbr br-79ea889a5ac8

 

Virtual EthernetPair简称veth pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样.

、创建一堆”veth pair”接口A和B

ip link add A type veth peer name B

、绑定A接口到网桥docker0

brctl addif docker0 A

、启用A接口

ip link set A up

brctlUsage: brctl [commands]commands:

 addbrbridge的名称  #添加bridge delbr bridge的名称 #删除bridge addif bridge的名称device的名称#添加接口到bridge delif bridge的名称device的名称#bridge中删除接口 setageing bridge的名称时间     #设置老化时间,即生存周期 setbridgeprio bridge的名称优先级#设置bridge的优先级 setfd bridge的名称时间         #设置bridge转发延迟时间 sethello bridge的名称时间      #设置hello时间 setmaxage bridge的名称时间     #设置消息的最大生命周期 setpathcost bridge的名称端口权重#设置路径的权值 setportprio bridge的名称端口优先级#设置端口的优先级 show     #显示bridge列表 showmacs bridge的名称  #显示MAC地址 showstp  bridge的名称          #显示bridgestp信息 stp bridge的名称{on|off}      #/stp