Docker入门学习笔记

docker学习笔记

一.安装

sudo pacman -S docker

二.镜像

1.获取镜像

sudo docker pull 镜像名[:标签名]

2.查看镜像信息

sudo docker images

3.给镜像添加标签

sudo docker tag 镜像名:标签名 新名字:新标签名

4.搜寻镜像

sudo docker search 镜像名

5.删除镜像

sudo docker rmi 镜像名标签名

sudo docker rmi 镜像ID

注:无法删除已经创建容器的镜像

sudo docker rmi -f 镜像名或ID # 强制删除,不推荐,应先删除容器

6.创建镜像

①.基于已有镜像的容器创建

命令格式为:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要选项

-a, --author="" # 作者信息

-m, --message="" # 提交信息

-p, --pause=ture # 提交时暂停容器运行

例:

sudo docker commit -a "kain huck" -m "first build a image" e4f60aee5987 my_image

②.基于本地模板导入

也可以直接从一个操作系统模板文件导入一个镜像.推荐使用OpenVZ提供的模板来创建.地址为:

http://openvz.org/Download/templates/precreated

假如下载了一个ubuntu-14.04的模板压缩包后,可以使用一下命令导入:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

7.存出和载入镜像

①.存出镜像

sudo docker save -o 镜像名.tar 镜像名

②.载入镜像

sudo docker load --input 镜像名.tar

sudo docker load < 镜像名.tar

8.上传镜像

默认上传到DockerHub官方仓库(需要登录),格式为:

docker push NAME[":TAG"]

用户在DockerHub网站注册后,即可上传自制镜像.例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push命令上传镜像:

sudo docker tag test:latest user/test:latest

sudo docker push user/test:latest

第一次使用时,会提示输入登录信息或进行注册

三.容器

1.新建容器

使用docker create命令新建容器,命令格式为:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

例如:

sudo docker create -it ubuntu:latest

使用docker create命令新建的容器处于停止状态,

2.启动容器

使用docker start来启动已经创建的容器

sudo docker start CONTAINER

3.新建并启动容器

使用docker run命令,例如:

sudo docker run ubuntu /bin/echo 'hello world'

后台的操作包括

1.检查本地是否存在指定的镜像,不存在就从公有仓库下载

2.利用镜像创建并启动一个容器

3.分配一个系统文件,并在只读镜像层外面挂载一层可读写层

4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

5.从地址池配置一个IP地址给容器

6.执行用户指定的应用程序

7.执行完毕后容器被终止

启动一个bash终端

sudo docker run -t -i ubuntu:14.04 /bin/bash

-t # 分配一个伪终端

-i # 标准输入保持打开

用exit退出后docker进入终止状态

4.守护态运行

通过 -d 参数来实现,例如:

sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

利用 sudo docker ps 查看运行的容器

利用 sudo docker ps -a 查看所有的容器

获取容器输出信息

sudo docker logs CONTAINER

5.终止容器

命令格式为:

docker stop [-t|--time [=10]]

此外,当docker容器中指定的容器终结后,容器也自动终止.使用exitCtrl+d来退出终端时,容器也立即终止.

例如(ce5为容器id):

sudo docker stop ce5

使用如下命令查看所有终止状态的容器:

sudo docker ps -a -q

6.进入容器

①.attach命令

sudo docker attach CONTAINER

注:所有窗口同步显示 ,存在阻塞风险

②.exec命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

③.nsenter工具

检查是否已经存在该工具,不存在则安装(以archLinux为例):

sudo pacman -S nsenter

找到容器的PID

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

利用该PID连接容器

nsenter --target $PID --mount --uts --ipc --net --pid

7.删除容器

命令格式为:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

-f, --force=false # 强行终止并删除一个运行中的容器

-l, --link=false # 删除容器的连接,但保留容器

-v, --volumes=false # 删除容器挂载的数据卷

8.导入和导出容器

①.导出容器

命令格式为:

docker export [OPTIONS] CONTAINER

例如,将ce5542...容器导出到test.tar文件:

sudo docker export ce5 > test.tar

②.导入文件

命令格式为:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

例如:

cat test.tar | sudo docker import - test/ubuntu:v1.0

四.仓库

1.Docker Hub

这是docker官方维护的公共仓库,网址为:

https://hub.docker.com

①.登录

通过docker login命令来输入用户名,密码和邮箱来完成注册和登录.注册成功后,本地用户目录的.dockercfg中将保存用户的认证信息

②.基本操作

docker search # 查找镜像(无需登录)

docker pull # 下载镜像(无需登录)

docker push # 上传镜像(需登录)

③.自动创建

步骤如下:

  1. 创建并登录Docker Hub,以及目标网站;* 在目标网站中链接账户到Docker Hub.

  2. 在Docker Hub中配置一个自动创建.

  3. 选取一个目标网站中的项目(需要含Dockerfile)和分支.

  4. 指定Dockerfile的位置,并提交创建

2.Docker Pool(已废弃)

Docker Pool是国内的Docker技术社区,提供镜像下载,网址为:

http://dockerpool.com

①.查看镜像

访问http://www.dockerpool.com/downloads,即可查看

②.下载镜像

在镜像前添加服务器具体的地址 dl.dockerpool.com:5000

例如,下载一个ubuntu仓库的12.04镜像:

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

3.创建和使用私有仓库

sudo docker run -d -p 5000:5000 registry

这将自动下载并启动一个registry容器,创建本地的私有仓库服务

默认将仓库创建在容器的/tmp/registry目录下,可使用-v参数更改为本地路径,如:

sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

4.管理私有仓库镜像

假设搭建私有仓库的地址为10.0.2.2:5000

查看已有镜像

sudo docker images

给镜像贴标签

sudo docker tag ubuntu:14.04 10.0.2.2:5000/test

上传镜像

sudo docker push 10.0.2.2:5000/test

用curl查看仓库10.0.2.2:5000中的镜像

curl http://10.0.2.2:5000/()/search

从另一台可访问10.0.2.2:5000的电脑上下载该镜像

sudo docker pull 10.0.2.2:5000/test

五.数据管理

1.数据卷

数据卷是一种可供容器使用的特殊目录,它绕过文件系统,具有以下特性:

  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会立马生效
  3. 对数据卷的更新不会影响镜像
  4. 卷会一直存在,直到没有容器使用

①.在容器内创建一个数据卷

在执行docker run命令是加上 -v 参数创建数据卷(可以创建多个),例如

使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/webapp目录:

sudo docker run -d -P --name web -v /webapp training/webapp python app.py

-P 是允许外部访问容器需要暴露的端口

③.挂载一个主机目录作为数据卷

挂载一主机的/src/webapp目录到容器的/opt/webapp目录

sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

注意:必须为绝对路径,默认权限为读写(rw)

设置为只读(ro):

sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

④.挂载一个本地主机文件作为数据卷

sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

注:--rm标记会使容器使用完后立即删除,不能和-d同时使用

2.数据卷容器

用于容器之间共享数据

  1. 创建数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:

    sudo docker run -it -v /dbdata --name dbdata ubuntu

  2. 在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷(db为容器名)

    sudo docker run -it --volumes-from dbdata --name db ubuntu

  3. 这样就已经实现数据共享了,注意--volumes-from可以使用多次

3.利用数据卷容器迁移数据

①.备份

sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

解释:

首先利用ubuntu镜像创建了一个容器worker.使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录.

worker容器启动后,使用了tar cvf /backup/backup.tar /dbdata命令来将/dbdata下的内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar.

②.恢复

  1. 先创建一个带有数据卷的容器dbdata2:

    sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

  2. 创建一个新的容器挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中即可

    sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

六.网络基础配置

1.端口映射实现访问容器

①.从外部访问容器应用

使用-P随机映射一个49000~49900的端口到容器内部

sudo docker run -d -P training/webapp python app.py

查看:

sudo docker ps -l

或者:

sudo docker logs -f CONTAINER

-p可以指定端口,并且可以绑定容器,格式为:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

②.映射所有接口地址

hostPort:containerPort

sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

③映射指定地址到指定端口

ip:hostPort"containerPort

sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

④.映射指定地址到任意端口

ip::containerPort

系统自动分配:

sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

指定udp端口:

sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

⑤.查看映射端口配置

sudo docker port CONATINER 5000

2.容器互联实现容器间通信

①.自定义容器命名

使用--name标记

sudo docker run -d -P --name web training/webapp python app.py

使用docker ps来验证设定的名字

sudo docker ps -l

使用docker inspect来查看容器的名字

sudo docker inspect -f "{{ .Name }}" aed84ee21bds

注意:名字唯一

②.容器互联

使用--link参数

例如:

  1. 创建新的数据库容器

    sudo docker run -d --name db training/postgres

  2. 删除之前创建的web容器

    sudo docker rm -f web

  3. 创建一个新的web容器,并将它连接到db容器

    sudo docker run -d -P --name web --link db:db training/webapp python app.py

--link的格式:

--link name:alias

name是要链接的容器的名称

alias是这个链接的别名

可以使用docker ps查看链接

3.公开连接信息的两种方式

①.环境变量

env命令

sudo docker run --rm --name web2 --link db:db training/webapp env

前缀采用大写的连接别名

②./etc/hosts文件

进入容器后

cat /etc/hosts

七.使用Dockerfile创建镜像

1.基本结构

Dockerfile分为四个部分

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  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_usr@email.com

# 镜像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "
daemon off;" >> /etc/nginx/nginx.conf

# 容器启动时执行的命令
CMD /usr/sbin/nginx

2.指令

一般格式为

INSTRUCTION arguments

①.FROM

格式为:

FROM <image>

第一条指令必须为FROM,并且如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM

②.MAINTAINER

格式为:

MAINTAINER <name>

指定维护者信息

③.RUN

格式为:

RUN <command>

RUN ["executable", "paraml", "param2"]

前者在shell终端中运行指令, 即/bin/sh -c;后者使用exec执行.

指定使用其他终端也可以使用第二种,例如

RUN ["/bin/bash", "-c", "echo hello"]

每条RUN指令将在当前镜像的基础上执行指定的命令,并提交为新的镜像.当命令较长时可以使用来换行.

④.CMD

支持三种格式:

CMD ["executable", "paraml", "param2"] 使用exec执行,推荐方式

CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用

CMD ["paraml", "param2"] 提供给ENTRYPOINT的默认参数

容器启动时执行的命令,一个Dockerfile文件只能有一条CMD命令

⑤.EXPOSE

格式为:

EXPOSE <port> [<port>. . .]

例如:

EXPORT 22 80 8443

告诉Docker服务端暴露的端口号,供互联系统使用.

⑥.ENV

格式为:

ENV <key> <value>

指定一个环境变量,会被后续RUN指令使用,并在容器中运行时保持.

例如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

⑦.ADD

格式为:

ADD <src> <dest>

该指令将复制指定的<src>到容器中的<dest>.其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(自动解压为目录)

⑧.COPY

格式为:

COPY <src> <dest>

复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)为容器中的<dest>.路径不存在时自动创建.

当使用本地目录为

⑨.ENTRYPOINT

格式为:

ENTRYPOINT ["executable", "parama1", "param2"]

ENTRYPOINT command param1 param2 (shell中执行)

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖.

每个Dockerfikle中只能有一个ENTRYPOINT.

⑩.VOLUME

格式为:

VOLUME ["/data"]

创建一个可从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等.

11.USER

格式为:

USER daemon

指定运行容器时的用户名或UID,后续的RUN也会使用指定用户.

当服务不需要管理员权限时,可以通过该命令指定运行用户.并且可以在之前创建所需要的用户,例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用gous,而不推荐sudo.

12.WORKDIR

格式为:

WORKDIR /path/to/workdir

为后续的RUN, CMD, ENTRYPOINT指令配置工作目录.

可以使用多个WORKDIR指令,后续命令如参数是相对路径,则会基于之前命令指定的路径.例如:

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

则最终路径是/a/b/c

13.ONBUILD

格式为:

ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令.例如,Dockerfile使用如下的内容创建镜像image-A.

[...]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[...]

如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像时,会自动执行ONBUILD指令内容,等价于在后面添加了两条指令.

FROM image-A

# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild

3.创建镜像

docker build [OPTIONS] PATH | URL | -

该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像.因此一般建议放置Dockerfile的目录为空目录.

另外,可以通过.dockeringnore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件.

要指定镜像的标签信息,可以通过 -t 选项.

例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用下面的命令:

sudo docker build -t build_repo/first_image /tmp/docker_builder/

原文地址:https://www.cnblogs.com/kainhuck/p/10915902.html