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学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记-持续更新中

Docker学习笔记 — 开启Docker远程访问

docker~学习笔记索引

学习笔记尚硅谷周阳老师的Docker教程学习笔记

Docker 学习笔记 Docker 仓库数据卷数据卷容器,网络基础实操。高级网络配置学习

docker学习笔记