Docker学习笔记
Posted lwzcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker学习笔记相关的知识,希望对你有一定的参考价值。
Docker学习笔记
一、Docker是什么?
- Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
1.docker与虚拟机的比较
- Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
- 传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
- 传统虚拟机
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。
-docker
二、docker的使用操作
1.安装doker,建议在ubantu上安装
1.yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
2.安装需要的安装包
yum install -y yum-utils device-mapper-persistent-data lvm2
3.设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker
yum -y install docker-ce
6.启动docker
手动启动:systemctl start docker
自动启动:systemctl enable docker
7.检查版本
docker version
下载并运行HelloWorld:docker run hello-world
8.配置镜像加速器
mkdir -p /etc/docker
vim /etc/docker/daemon.json
设置阿里云加速器(推荐)
"registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"]
网易云
"registry-mirrors": ["http://hub-mirror.c.163.com"]
ustc(不需要注册)
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
设置完重启docker
systemctl daemon-reload
systemctl restart docker
9.卸载
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
yum remove docker \\
docker-client \\
docker-client-latest \\
docker-common \\
docker-latest \\
docker-latest-logrotate \\
docker-logrotate \\
docker-engine
2.run命令流程
3.docker基本命令
操作 | 命令 |
---|---|
启动docker: | systemctl start docker |
停止docker: | systemctl stop docker |
重启docker: | systemctl restart docker |
查看docker状态: | systemctl status docker |
开机启动: | systemctl enable docker |
查看docker概要信息: | docker info |
查看docker帮助文档: | docker --help |
4.docker常用指令
命令 | 备注 |
---|---|
cp | 本地文件系统(OS操作系统|宿主机)和容器之间进行文件或者文件夹拷贝 |
exec | 登录一个容器,使用命令行操作正在运行的容器。 |
images | 镜像的集合查询。 |
ps | 容器列表 |
pull | 下载镜像 |
restart | 重启一个或多个容器 |
rm | 删除一个或多个容器 |
rmi | 删除一个或多个镜像 |
run | 创建一个容器,并运行起来 |
save | 导出镜像到一个文件(tar)中 |
search | 搜索镜像(从Docker Hub) |
start | 启动一个或多个已经停止的容器 |
stop | 停止一个或多个正在运行的容器 |
三、常用命令
镜像相关
1.docker images
- 查看镜像
列名 | 注释 |
---|---|
REPOSITORY | 镜像名称 |
TAG | 镜像标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建日期 |
SIZE | 镜像大小 |
2.docker search [镜像名称]
- 搜索镜像
列名 | 注释 |
---|---|
NAME | 仓库名 |
DESCRIPTION | 镜像描述 |
STARS | 用户评价,反应一个镜像的受欢迎程度 |
OFFICIAL | 是否官方 |
AUTOMATED | 自动构建,表示该镜像由Docker Hub自动构建流程创建 |
3.docker pull [镜像名称]
- 拉取镜像, 拉取镜像时去过不指定镜像的版本 就会拉取最新的版本的镜像
- 镜像名格式: [名称:版本号]
4.docker rmi [镜像ID]
- 删除镜像
删除单个镜像(-f 强制删除):docker rmi -f 镜像ID
删除多个镜像:docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除所有镜像:docker rmi -f $(docker images -qa)
容器相关
1.查看容器
操作 | 命令 |
---|---|
查看正在运行的容器: | docker ps |
查看所有容器: | docker ps –a |
查看最后一次运行的容器: | docker ps –l |
查看停止的容器: | docker ps -f status=exited |
2.创建容器
- 创建容器命令: docker run
命令 | 注释 |
---|---|
-i | 表示运行容器 |
-t | 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。 |
--name | 为创建的容器命名 |
-v | 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 |
-d | 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器) |
-p | 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 |
- 交互式创建容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器 是前台容器。
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
# 比如:docker run -it --name=mycentos centos:7 /bin/bash
# docker run:表示创建容器
# -it:表示运行容器并进入它的命令行
# --name=mycentos:给当前的容器命名
# centos:7:使用该镜像创建
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
退出当前容器:exit
退出之后,容器也退出了,没有删除
- 后台式创建容器
docker run -id --name=mycentos2 centos:7
- 守护进程方式创建容器(常用)
- 创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
# 守护式容器和交互式容器的创建方式区别:
# ① -it 换成 -di
# ② 去掉后面的 /bin/bash
docker run -di --name=容器名称 镜像名称:标签
# 比如:docker run -di --name=mycentos10 centos:7
进入守护进程容器方式
docker exec -it 容器名称 (或者容器ID) /bin/bash
# 比如 docker exec -it mycentos10 /bin/bash
重新进入
docker attach 容器ID
上述两个区别:
attach: 直接进入容器启动命令的终端,不会启动新的进程
exec: 是在容器中打开新的终端,并且可以启动新的进程
3.停止与启动容器
- 停止容器
docker stop 容器名称(或者容器ID)
例如: docker stop mycentos2
- 启动容器
docker start 容器名称(或者容器ID)
例如: docker start mycentos2
4.文件拷贝
我们需要在容器内安装一个软件,软件首先需要有安装包,我们就需要把安装包拷贝到容器内。我们通常的操作是先把文件上传到宿主机,然后我们在将文件从宿主机拷贝到容器内的某个目录下面进行安装。
将linux宿主机中的文件拷贝到容器内可以使用命令:
docker cp 需要拷贝的文件或目录 容器名称:容器目录
例如: docker cp anaconda-ks.cfg mycentos2:/usr/local/
拷贝一个文件到 mycentos2 的 /urs/local/ 文件下面,拷贝完成之后,删除文件,然后在mycentos2拷贝过来
登录容器查看拷贝结果
docker exec -it mycentos2 /bin/bash
docker exec:表示登陆正在运行的容器
-it:进入命令行
mycentos2:进入到该容器
将文件从容器中拷贝出来
我们先通过 exit 退出容器,然后在把文件从容器拷贝到当前目录
docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如:docker cp mycentos2:/usr/local/anaconda-ks.cfg ./
5.查看容器日志
- 命令
docker logs [OPTIONS] 容器ID或名称
OPTIONS说明:
• -t :是加入时间戳
• -f :跟随最新的日志打印
• -n :数字 显示最后多少条
6.查看容器内运行的进程
docker top 容器ID或名称
7.查看容器细节
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID)
# 在linux宿主机下查看 mycentos3 的ip
8.删除容器
- 删除指定容器
docker rm 容器名称(容器ID)
例如:docker rm mycentos11
- 删除容器的时候,如果容器在运行,会报错,必须先停止容器
# 查看正在运行的容器
docker ps
# 删除正在运行的容器
docker rm mycentos11
# 停止容器
docker stop mycentos11
# 查看所有的容器,看看是否有mycentos11
docker ps -a
# 删除centos11容器
docker rm mycentos11
# 删除完成之后,在查看mycentos11容器是否还存在
docker ps -a
也可以使用-f参数进行强制删除:docker rm -f 容器名称或id
9.目录挂载(重点)
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
概念:
①数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据,在docker中我们使用卷。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
• 1:数据卷可在容器之间共享或重用数据
• 2:卷中的更改可以直接生效
• 3:数据卷中的更改不会包含在镜像的更新中
• 4:数据卷的生命周期一直持续到没有容器使用它为止
②数据卷容器:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
- 创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:
# 创建并启动容器mycentos3,并挂载linux中的/usr/local/myhtml目录到容器的/usr/local/myhtml;也就是在linux中的/usr/local/myhtml中操作相当于对容器相应目录操作
docker run -di --name=容器的名字 -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
比如:docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7
-
通过 docker ps 查看正在运行的容器,在创建容器并且进行目录挂载,然后在通过 docker
ps 查看刚刚创建的容器是否已经创建 -
进入到 myhtml 目录 ,通过dir查看是否有文件,通过vi test2 ,创建一个文件,进入test2文件,随便输入一些数据
-
进入目录随便输入一些东西 , 退出保存
登录容器,查看刚刚输入的内容
# 进入容器 docker exec -it mycentos11 /bin/bash # 进入容器中查看目录 cd /usr/local/myhtml # 查看myhtml目录中,是否有对应文件test2.txt ls cat test2 # 退出容器 exit
-
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
--privileged=true 来解决挂载的目录没有权限的问题
docker run -id --privileged=true --name=mycentos5 -v /usr/local/myhtml:/usr/local/myhtml centos:7
10.所有命令
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container\'s filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
四、docker迁移与备份
迁移备份命令
o docker commit 将容器保存为镜像
o docker save 将镜像备份为tar文件
o docker load 根据tar文件恢复为镜像
1.将容器保存为镜像
- 将容器保存为镜像
# 保存nginx容器为镜像
docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i
2.镜像备份
- 保存镜像为tar文件
# 命令形式:docker save –o tar文件名 镜像名
# 保存镜像为文件 -o:表示output 输出的意思
docker save -o mynginx.tar mynginx_i
3.镜像恢复与迁移
- 恢复镜像命令
# 命令形式:docker load -i tar文件名
#-i 表示input输入的文件
docker load -i mynginx.tar
五、Dockerfile文件
-
什么是dockerfile
-
如果我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfile
Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
1.dockerfile常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
2.使用脚本创建镜像
- 创建目录
# -p 创建目录路径
mkdir –p /usr/local/dockerjdk8
- 下载jdk-8u144-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录、
- 移动目录刚刚上传的 jdk 到 /usr/local/dockerjdk8 目录下面
#移动命令
mv jdk-8u144-linux-x64.tar.gz /usr/local/dockerjdk8
- 创建文件Dockerfile 并vi Dockerfile
# Dockerfile 名字不要改
vi Dockerfile
- 编辑Dockerfile
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER atguigu
#切换工作目录
WORKDIR /usr
#RUN yum install -y glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
- 执行命令构建镜像
docker** build -t=\'jdk1.8\'
Docker 学习笔记 Docker 基础操作实,Docker仓库数据卷,网络基础学习
Docker 学习笔记【3】 Docker 仓库实操,创建私有仓库,实操数据卷、数据卷容器,实操 网络基础 ---------高级网络配置和部分实战案例学习
=============================================================
Docker 学习笔记【1】Docker 相关概念,基本操作--------实操记录开始
=============================================================
被格式化的脚本内容:
#开头代表宿主机的root用户执行的命令
[[email protected] /]# 类似开头的,实在docker启动的实例中执行的命令
--1--安装:
1、环境信息:
硬件:基于openstack的一台云虚拟主机 配置为:16C 32GB 此机上还运行了:两个mysql数据库,一个开发,一个测试,一个tomcat做zabbix通过jmx监控实验,后续会有相关文档 系统信息:CentOS release 6.8 (Final) uname -a:Linux b-test14 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 用户:root
2、开始安装:
安装docker:
#yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm #yum install docker-io
检查安装:
#docker -v Docker version 1.7.1, build 786b29d/1.7.1 # ifconfig docker0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::dcb0:1aff:fe0a:8982/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:460 (460.0 b) TX bytes:468 (468.0 b)
启动docker后台服务:
# service docker start Starting cgconfig service: [ OK ] Starting docker: [ OK ] # chkconfig docker on
后台服务启动检查:
#ps -ef | grep docker root 15982 1 0 10:33 pts/1 00:00:00 /usr/bin/docker -d root 16154 15286 0 10:35 pts/1 00:00:00 grep docker # chkconfig --list | grep docker docker 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3、获取镜像:
注:12.04为笔记【1】中的内容,呼应一下,不过我们应用主要跑在centos下,所以后续的主要实操会基于centos 6.8
# docker pull ubuntu:12.04 12.04: Pulling from ubuntu 94bf32934729: Pull complete 5e12b5525fb8: Pull complete df24de65c977: Pull complete 8cc279ff6556: Pull complete 13c47942ea6e: Pull complete cfc2576a1531: Pull complete Digest: sha256:6ab19ca6ef048136b8aeb513e6fb715c005fd671a536039567b1d261f2f0779e Status: Downloaded newer image for ubuntu:12.04 # docker pull centos:6.8 6.8: Pulling from centos 3690474eb5b4: Pull complete 386c6db8c14f: Pull complete 8986abc42d08: Pull complete 80e46367f846: Pull complete Digest: sha256:233cbc13832f97e83773d2e4a6f9f3a81959bc9b5c1b03135d6bbd67a9db8b66 Status: Downloaded newer image for centos:6.8
本地镜像检查:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
4、扩展:
time命令,可以统计某个命令执行耗时,如下,可看出docker启动一个echo应用,约3s:
time docker run centos:6.8 /bin/echo what what real 0m2.645s user 0m0.031s sys 0m0.027s
通过镜像启动一个docker实例,整个过程约3s:
启动echo应用输出一个what,效率略低于直接在本地执行:
# docker run centos:6.8 /bin/echo what what
启动bash交互界面,启动过程约3-5s可以通过ps看出,启动十分轻量级
# docker run -t -i centos:6.8 /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 02:42 ? 00:00:00 /bin/bash root 12 1 0 02:42 ? 00:00:00 ps -ef [[email protected] /]# pwd /
5、修改镜像:
终端1【不要exit】:
#docker run -t -i centos:6.8 /bin/bash [[email protected] /]# yum install lrzsz Loaded plugins: fastestmirror, ovl Setting up Install Process Determining fastest mirrors * base: mirrors.btte.net * extras: mirrors.btte.net * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package lrzsz.x86_64 0:0.12.20-27.1.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================= Installing: lrzsz x86_64 0.12.20-27.1.el6 base 71 k Transaction Summary ================================================================================================================================= Install 1 Package(s) Total download size: 71 k Installed size: 159 k Is this ok [y/N]: y Downloading Packages: lrzsz-0.12.20-27.1.el6.x86_64.rpm | 71 kB 00:00 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Importing GPG key 0xC105B9DE: Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]> Package: centos-release-6-8.el6.centos.12.3.x86_64 (@CentOS/6.8) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Verifying : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Installed: lrzsz.x86_64 0:0.12.20-27.1.el6 Complete!
终端2:
注意:
查看所有已经创建的container实例:
#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17d146c6710d centos:6.8.my.1 "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago kickass_swartz 4bdb037d6f75 cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c ‘yum -y 22 minutes ago Exited (137) 20 minutes ago berserk_kilby 8f2e422eb7ae cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c ‘yum ins 23 minutes ago Exited (1) 22 minutes ago evil_mestorf 11b3d795a062 centos:6.8.my "/bin/bash" 25 minutes ago Exited (0) 24 minutes ago suspicious_mccarthy e283711c5bdf centos:6.8.my "/bin/bash" 26 minutes ago Exited (1) 26 minutes ago stupefied_cori 4a74b6b158f0 centos:6.8.my "/bin/bash" 35 minutes ago Exited (0) 31 minutes ago backstabbing_mcclintock ec600b17b4ad centos:6.8 "/bin/bash" 42 minutes ago Exited (0) 35 minutes ago loving_lovelace 8864174c48ea centos:6.8 "/bin/bash" 47 minutes ago Exited (0) 46 minutes ago jolly_torvalds 591e0f5c1817 centos:6.8 "/bin/bash" 49 minutes ago Exited (0) 49 minutes ago cranky_torvalds bc2496541488 centos:6.8 "/bin/echo what" 50 minutes ago Exited (0) 50 minutes ago fervent_cori 2b7ee7dc7a4d centos:6.8 "/bin/bash" 52 minutes ago Exited (0) 51 minutes ago focused_bartik f144b72eb4ab centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago elegant_bohr 547b76094492 centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago sad_poitras 查看CONTAINER ID # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec600b17b4ad centos:6.8 "/bin/bash" About a minute ago Up About a minute loving_lovelace
通过运行中的CONTAINER创建镜像centos:6.8.my,返回的id为镜像的唯一id
# docker commit -m "ADDed lrzsz" -a "Docker my-a" ec600b17b4ad centos:6.8.my c24da2edd993ebbbbabb81ab349f2146813ea34f9f87821630fd13ad1ab4c745
罗列所有可用镜像:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 About a minute ago 255 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用修改的镜像启动容器实例:
如下可见,刚才在容器通过yum安装的软件已经包含在了自己创建的镜像。
# docker run -t -i centos:6.8.my /bin/bash [[email protected] /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64
6、创建docker镜像:
->1、使用Dockerfile:
创建目录和makefile文件:
#mkdir image_maker_sinatra #cd image_maker_sinatra #touch Dockerfile
确认镜像中不存在my.tag的文件
# docker run -t -i centos:6.8.my /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# exit exit
Dockerfile内容:
#cenos:6.8.my.1 maker FROM centos:6.8.my MAINTAINER Docker lich <[email protected]> RUN echo "my tag" > my.tag
执行新建镜像:
# docker build -t "centos:6.8.my.1" . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos:6.8.my ---> c24da2edd993 Step 1 : MAINTAINER Docker lich <[email protected]> ---> Using cache ---> cbbdcb29ca21 Step 2 : RUN echo "my tag" > my.tag ---> Running in f89b6bc65148 ---> 3ebfbda17fb8 Removing intermediate container f89b6bc65148 Successfully built 3ebfbda17fb8
查看所有centos镜像:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 About a minute ago 255 MB centos 6.8.my c24da2edd993 19 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用新镜像启动docker容器,检验内容:
如下内容可以看出,6.8.my中的lrzsz存在,并且Dockerfile中指定生成的文件、以及其内容都存在:
# docker run -t -i centos:6.8.my.1 /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt my.tag opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# cat my.tag my tag [[email protected] /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64 [[email protected] /]# exit exit
-2>使用openvz【容器虚拟化的先锋技术】创建镜像:
先下载镜像【可能需要跳出墙外,这个网址在国内的访问速度几乎为0】:
#wget https://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz
使用的时候报错了,这个错误的原因是下载的文件有问题,不完整或者有损坏:
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 Error response from daemon: ApplyLayer exit status 1 stdout: stderr: unexpected EOF
重新下载之后,导入完成
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 35b7ec25ed6f9657ff7581a8c7643c2ce48d1b892eac6116b783b43fc8fd9bfc
docker attach的时候执行了一个exit,导致主机除了一些问题:
报错:
# docker pull centos:6.8 Pulling repository centos Get https://index.docker.io/v1/repositories/library/centos/images: dial tcp: lookup index.docker.io: Temporary failure in name resolution
解决:
重新登录一下
【由于之前系统出现了一些问题,所以删除了部分image,现有image如下,可见my_centos:6.8已经在本地仓库了】
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8 35b7ec25ed6f 36 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
7、镜像导出、导入:
导出【需要本地存在该镜像,如果不存在,请先pull下来】:
# docker save -o centos_68my1.tar centos:6.8.my.1 # ll total 256636 -rw-r--r-- 1 root root 262789632 Nov 10 11:31 centos_68my1.tar . # du -sh * 251M centos_68my1.tar
导入:
1、导入会校验id,如果一样就不导入了,所以要删除创建时候使用的镜像centos:6.8.my.1:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 22 minutes ago 255 MB centos 6.8.my c24da2edd993 39 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker rmi 3ebfbda17fb8 Error response from daemon: Conflict, cannot delete 3ebfbda17fb8 because the container 17d146c6710d is using it, use -f to force Error: failed to remove images: [3ebfbda17fb8]
报错信息指向一个容器,说又通过该镜像启动的容器实例,因此我们需要使用-f命令强制删除镜像和通过该镜像创建的所有实例
# docker rmi -f 3ebfbda17fb8 Untagged: centos:6.8.my.1 Deleted: 3ebfbda17fb85e28ae24faa77cf8d7811e0068f428a4763042708b15d00ee2aa Deleted: cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f
可以看到,centos:6.8.my.1被删除了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 42 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
2、删除后,进行导入操作:
# docker load --input centos_68my1.tar
可以看到导入之后镜像库里面的镜像就回来了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改镜像的TAG: centos:6.8.my.1 centos:6.8.my 这样的TAG不够明显,修改一下: 首先查出image对应id: # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改TAG: # docker tag c24da2edd993 my_centos:11.10.1 # docker tag 3ebfbda17fb8 my_centos:11.10.2 # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 29 minutes ago 255 MB centos 6.8.my c24da2edd993 47 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker images my_centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 11.10.2 3ebfbda17fb8 29 minutes ago 255 MB my_centos 11.10.1 c24da2edd993 47 minutes ago 255 MB
从结果可以看出,好像是创建了两个新的镜像,实际上仔细观察就会发现他们的IMAGE ID 是一样的,也就是说,相当于创建了两个不一样名字的快捷方式,其实实体image还是同一个!
删除镜像:
在导入的时候由于需要删除再导入,已经介绍了,就不演示了
注意点:
docker rm 是删除依赖于这个镜像所有的docker容器的命令
docker rmi执行前,需要先执行docker rm 或者 在rmi后面加上-f 强制删除参数,将会删除镜像以及镜像创建出的所有容器!
8、守护态启动容器:
# docker run -d my_centos:11.10.1 /bin/sh -c "while true;do echo what is your name;sleep 1;done" f00717ca5c5eb4e449181bb99b98e8e86910b957ceda82f31e5440bf61cef979
查看运行中实例:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f00717ca5c5e my_centos:11.10.1 "/bin/sh -c ‘while t 39 seconds ago Up 37 seconds serene_cray
查看容器输出内容
# docker logs serene_cray what is your name what is your name what is your name 。 。 。 或者 # docker logs f00717ca5c5e what is your name what is your name what is your name 。 。 。
9、终止运行中容器:
docker stop后面可以跟上id 也可是names
# docker stop serene_cray serene_cray # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10、进入守护态容器:
启动一个守护态容器:
# docker run -t -i -d my_centos:11.10.1 /bin/bash 3e4c55543d86c86961c3d0f1d7b8af212a8943e9a6c58171c61e7b5fe98fbf29 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e4c55543d86 my_centos:11.10.1 "/bin/bash" 4 seconds ago Up 2 seconds agitated_albattani
1、attach进入【命令完了需要多敲回车】:
# docker attach agitated_albattani [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# uname -a Linux 3e4c55543d86 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [[email protected] /]# cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m
注:exit命令会导致容器终止!只推出attach 使用 ctrl+p 之后 ctrl+q即可推出attach 而不终止容器
2、nsenter进入:
确认版本:
# nsenter -V nsenter from util-linux-ng 2.17.2 查看docker后台运行容器的第一pid: # docker inspect --format "{{ .State.Pid }}" 43a81bd378f9 12590
将.bashrc_docker 内容加到.bashrc中
#wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker #echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
连接到后台运行的docker容器
【此方式可以使用exit,并且多个人登录获得的终端不是同步的】
# nsenter --target 12590 --mount --uts --ipc --net --pid [[email protected] /]# ls bin boot dev etc fastboot home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# mpstat -bash: mpstat: command not found [[email protected] /]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 27886420 65100 933628 0 0 28 31 27 33 0 0 99 1 0 [[email protected] /]# free -g total used free shared buffers cached Mem: 31 4 26 0 0 0 -/+ buffers/cache: 3 27 Swap: 0 0 0 [[email protected] /]# exit logout
11、运行中的容器快照导出,还原为镜像:
导出:
#docker export 43a81bd378f9 > my_centos.tar
导入【将当时的快照状态还原成镜像,不包括元数据和历史记录等】:
# cat my_centos.tar| docker import - my_centos:6.8.0 8247cb10fde2c99f1febfa11d5729175fb5be9afdbdf3fb581d20259e9fcd392 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8.0 8247cb10fde2 28 seconds ago 343.8 MB my_centos 6.8 35b7ec25ed6f 53 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
12、删除容器:
docker ps
1终止状态容器
# docker rm 43a81bd378f9 43a81bd378f9
2运行中容器:
# docker rm -f 43a81bd378f9 43a81bd378f9
=============================================================
Docker 学习笔记【1】Docker 相关概念,基本操作--------实操记录结束
=============================================================
=============================================================
Docker仓库、数据卷,网络基础学习
=============================================================
--2--仓库:
1、概念:
仓库就是集中存放镜像的地方
一个比较容易混淆的就是注册服务器【Registry】,相当于一个很多仓库的管理器,合集如:
dl.dockerpool.com/ubuntu
dl.dockerpool.com注册服务器 ubuntu是仓库名
多数时候不严格区分
2、Docker Hub:
Docker官方维护的一个公共仓库,已经包括了超过15000的镜像,基本需求都可以直接下载使用。
登录:
docker login可以输入用户名密码和邮箱完成注册和登录,存储的信息在~/.dockercfg
基本操作:
搜索相关镜像:
docker search centos
下载镜像:
docker pull ${REPOSITORY}:${TAG}
自动创建:
对于要经常升级镜像内程序来说,十分方便。
有时候用户创建镜像只是为了安装某个软件,如果软件发布,则是需要手动更新镜像。
而自动创建允许用户通过Docker Hub指定跟踪一个目标网站,目前支持:GitHub和BitBucket上的项目一旦项目发生新提交,则执行自动更新。
配置自动升级步骤:
1、创建并登陆Docker Hub以及目标网站;
2、在目标网站将账号链接到Docker Hub;
3、Docker Hub中创建一个自动创建;
4、选取一个目标网站中的项目,需要包含Dockerfile,和分支;
5、指定Dockerfile的位置,并提交创建;
6、Docker Hub在自动创建页面跟踪每次创建的状态
3、私有仓库:
简述:
docker-registry官方提供的工具,可以用于构建私有的镜像仓库
安装运行--官方给出的registry镜像:
安装完Docker后,可以通过获取官方registry镜像来运行:
docker run -d -p 5000:5000 registry
这将使用官方的registry镜像启动本地仓库,用户也可以通过制定参数配置私有仓库位置,比如亚马逊的s3存储:
docker run -e SETTINGS_FLAVOR=s3 -e AWS_BUCKET=存储桶的名称 -e STORGE_PATH=/registry【s3桶存储没有目录,只是为了做访问路径用】 -e AWS_KEY=用户创建s3的key -e AWS_SECRET=亚马逊登录凭证 -e SEARCH_BACKEND=备份位置 -p 5000:5000 registry
此外,可以制定本地路径,如【将镜像存储位置修改为/home/admin/registry】:
docker run -d -p 5000:5000 -v /home/admin/registry:/registry registry
安装运行--本地运行:
yum方式:
yum install -y python-devel libevent-devel python-pip gcc xz-devel pip install docker-registry
也可下载源码进行安装:
git clone https://github.com/docker/docker-registry.git cd docker-registry python setup.py install
启动:
docker-registry
修改config.yml的内容修改镜像存储内容:storage_path
cp config/config_sample.yml config/config.yml
高级模式:
启动web服务:
gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
或者:
gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
提交指定容器到私有仓库:
docker tag ubuntu:12.04 私有库IP:5000/ubuntu:12.04 docker push 私有库IP:5000/ubuntu
从指定服仓库下载:
docker pull ${REPOSITORY}:${TAG}
自动上传本地所有image到本地的镜像,默认的服务器为127.0.0.1:5000:
wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh chmod a+x push_images.sh ./push_images.sh
查看私服中的所有镜像:
curl 私有库IP:5000/v1/search
返回的是json,里面的镜像列表
仓库配置文件【默认配置文件中】:
Docker的registry利用配置文件提供了一些仓库的模板,flavor,用户可以直接使用它们进行开发或者测试生产的部署
配置文件模板解释:
common :基础配置 ocal :存储数据到本地文件系统 s3 :存储数据到 AWS S3 中 dev :使用 local 模板的基本配置 test :单元测试使用 prod :生产环境配置(基本上跟s3配置类似) gcs :存储数据到 Google 的云存储 swift :存储数据到 OpenStack Swift 服务 glance :存储数据到 OpenStack Glance 服务,本地文件系统为后备 glance-swift :存储数据到 OpenStack Glance 服务, Swift 为后备 elliptics :存储数据到 Elliptics key/value
用户也可以自定义模板段
默认使用的模板是dev,要使用某个模板作为默认值,添加SETTINGS_FLAVOR到环境变量例如:
export SETTINGS_FLAVOR=dev
文件中,支持环境变量中加载某些值:
_env:VARIABLENAME[:DEFAULT]
文件示例:
common: loglevel:info search_backend:"_env:SEARCH_BACKEND:" sqlalchemy_index_database:"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db" prod: loglevel:warnstorage:s3 s3_access_key:_env:AWS_S3_ACCESS_KEY s3_secret_key:_env:AWS_S3_SECRET_KEY s3_bucket:_env:AWS_S3_BUCKET boto_bucket:_env:AWS_S3_BUCKET storage_path:/srv/docker smtp_host:localhost from_addr:[email protected] to_addr:[email protected] dev: loglevel:debugstorage:local storage_path:/home/myself/docker test: storage:local storage_path:/tmp/tmpdockertmp
--3--数据卷和数据卷容器:
Docker内部以及容器之间如何管理数据,主要方式就是:
1、数据卷:DATA VOLUMES
2、数据卷容器:DATA VOLUME CONTAINERS
1、数据卷:
数据卷是一个可提供一个或者多个容器使用的特殊目录,它绕过UFS,可提供很多的有用的特性:
1>数据卷可以再各容器实例之间共享和重复使用
2>对数据卷的修改立即生效
3>对数据卷的更新不影响镜像
4>卷一直存在,知道没有容器再使用
2、创建数据卷:
docker 命令使用-v参数来创建一个数据卷并挂在到容器中:
创建一个名为web 将数据卷training/webapp挂在到容器的/webapp目录并执行 python app.py命令
docker run -d -P --name web -v /webapp training/webapp python app.py
Dockerfile中也可以使用VOLUME 来添加一个或者多个新的数据卷到该镜像创建的任意容器中
挂在一个宿主机的目录作为数据卷:
将主机的/src/webapp目录加到到容器的/opt/webapp目录下
注意:
1、一般用于测试,docker运行是否正常
2、目录路径必须是绝对路径
3、如果本地路径目录不存在,docker会自动创建
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
默认挂在的数据卷权限是读写皆可,如要挂在一个只读权限的目录如下:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
当然也可以挂在单个文件到容器,必须想记录容器中的history的命令记录
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注意:
只挂在一个文件,在使用编辑工具的时候,比如 vi sed等,会导致文件inode的改变,1.1.0版本的docker起,这会导致报错。最好的办法是,挂在文件所在的父目录
数据卷容器:
如果有一些持续更新的数据需要在容器之间共享,最好创建一个数据卷容器:
数据卷容器其实也是一个容器,功能是专门提供数据卷供其他容器挂在!
创建一个数据卷容器,名字为dbdata:
docker run -it -v /dbdata:/dbdata --name dbdata training/postgres centos #docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container fo...
创建其他容器时,使用--volumes-from来挂在dbdata中的数据卷
docker run -d --volumes-from dbdata --name db1 training/postgres docker run -d --volumes-from dbdata --name db2 training/postgres
也可以使用多个--volumes-from 参数来从多个容器挂载多个数据卷,也可以从其他已经挂在了数据卷的容器来挂在数据卷
docker run -d --name db3 --volumes-from db1 training/postgres
使用--volumes-from参数所挂载数据卷的容器自己并不需要保持在运行状态
如果删除了挂载的容器,数据卷并不会自动删除,如果需要删除一个数据卷,必须在删除最后一个还挂载着该数据卷的容器时候使用docker rm -v来删除关联的数据卷,这可以让我们在容器之间升级和移动数据卷
3、利用数据卷容器,进行备份、恢复、迁移数据卷:
可以利用数据卷对其中的数据进行备份、恢复、迁移
备份:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar
容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar
恢复:
如果要恢复数据到一个容器,首先,要创建一个带有数据卷的容器:dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,并使用tar解压备份文件到挂在的容器中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
这样就完成了数据的备份和恢复
--4--docker中的网络:
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
1、外部访问容器:
docker在run的时候使用-P标记,会使Docker随机映射一个49000-49900的端口到内部容器开放的端口
docker run -d -P training/webapp python app.py docker ps
使用docker ps可以看到
PORTS列,有这样的标记0.0.0.0:49000->5000
此时访问,宿主机ip的49000端口就是访问docker容器的5000提供的web服务端口
可使用docker logs -f ${CONATINER_ID}持续关注docker的输出
docker在run的时候使用-p标记,则可以指定端口并且一个端口只可以绑定一个容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有接口地址
使用hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
docker run -d -p 5000:5000 training/webapp python app.py
映射到指定ip的指定端口:
可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
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 ${CONATINER_ID} 5000
注意: 1、容器有自己的内部网络和ip地址【使用docker inspect 可以获取所有变量。Docker还可以有一个可变的网络配置】 2、-p可以使用多次来绑定多个端口: docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
--5--容器互联:
容器的连接【linking】是除了端口映射以外,另一种与容器中应用交互的方式
该系统会在源和接受容器之间创建一个隧道,接受容器可以看到源容器的指定信息
自定义容器名称 --name
1、好记 有意义的名称好使用
2、可以作为参考点
docker run -d -P --name web training/webapp python app.py
docker ps 列表中会有NAME列
inspect查看docker的名字
docker inspect -f "{{ .Name }}" aed84ee21bde
注意:--rm 在终止实例后即删除容器实例 与 --d 不可同时使用
容器互联:--link参数让容器之间进行安全交互
创建一个新的数据容器
docker run -d --name db training/postgres
清空容器实例列表
创建一个新的web容器连接到db容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py
此时,db 容器和 web 容器建立互联关系。
--link 参数的格式为
--link name:alias ,其中
name 是要链接的容器的名称, alias 是这个连接的 别名。
docker ps
可以用来查看容器link
可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。
Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。
1、Docker通过两种方式为容器公开连接信息:
1、环境变量
2、更新/etc/hosts文件
env查看当前变量
sudo docker run --rm --name web2 --link db:db training/webapp env
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。
docker run -t -i --rm --link db:db training/webapp /bin/bash cat /etc/hosts
里面会有两个一个是当前容器的name解析 一个是link的容器的name解析
用户可以连接多个子容器到父容器。
以上是关于Docker学习笔记的主要内容,如果未能解决你的问题,请参考以下文章