Docker基础

容器的基本操作

启动容器

命令:docker run IMAGE [COMMAND] [ARG...]

  • IMAGE:启动容器所使用的操作系统镜像
  • COMMAND: 运行的命令
  • AGR: 对应参数
  • 例如:docker run ubuntu echo 'Hello World'
  • 这是一个执行单词命令的容器

启动交互式容器

命令:docker run -i -t IMAGE /bin/bash

  • -i告诉docker守护进程为容器始终打开标准输入
  • -t告诉为创建的容器分配一个伪tty终端
  • 例如:docker run -i -t ubuntu /bin/bash
  • 输入exit退出这个bash

查看容器

命令: docker ps [-a] [-l]

  • -a指列出所有容器
  • -l列出最新创建的一个容器
  • 如果没有参数返回正在运行的容器

结果的各参数含义:

  • container Id:docker守护进程在启动容器时为容器分配的唯一id
  • names:docker守护进程为容器自动分配的名字
  • IMAGE: 所使用的操作系统镜像
  • COMMAND: 运行的命令
  • CREATED: 创建时间

命令: docker inspect 容器名

  • 容器名既可以是id,也可以是name.
  • 返回配置信息

自定义容器名

命令:docker run --name=自定义名 -i -t IMAGE /bin/bashordocker run --name 自定义名 -i -t IMAGE /bin/bash

  • 例如: docker run --name=container01 -i -t ubuntu /bin/bash

重新启动停止的容器

命令:docker start [-i] 容器名

  • -i参数以交互的方式重新启动

删除停止的容器

命令:docker rm 容器名

docker守护式容器

什么是守护式容器

  • 能够长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务

以守护形式运行容器

命令: docker run -i -t IMAGE /bin/bash Crtl+P+Q退出bash使得容器在后台运行

附加到运行中的容器:

命令: docker attach 容器名

启动守护式容器(重要方式):

命令: docker run -d IMAGE [command] [arg...]

  • -d 告诉run命令启动容器时使用后台的方式,命令结束后容器依旧停止
  • 返回的值的是docker守护进程分配给容器的唯一id

查看容器日志

命令: docker logs [-f] [-t] [--tail] 容器名

  • -f告诉logs一直跟踪日志变化并返回 crtl+C停止
  • -t在返回的结果上加上时间戳
  • —tail选项是返回结尾处多少数量的,不加返回所有日志

查看容器内进程

命令: docker top 容器名

在运行的容器中启动新进程

命令:docker exec [-d][-i][-t] 容器名[COMMAND][ARG...]

停止守护式容器

命令:docker stop 容器名 or docker kill 容器名
stop发送一个信号给容器,等待容器的停止
kill直接停止容器

在容器中部署静态网站

设置容器的端口映射

命令:run [-P] [-p]

  • -P为容器暴露的所有端口进行映射
    如:docker run -p -i -t ubuntu /bin/bash
  • -p指定映射哪些容器端口
    指定容器端口,宿主机端口随机映射:docker run -p 80 -i -t ubuntu /bin/bash
    同时指定容器和宿主机端口:docker run -p 8080:80 -i -t ubuntu /bin/bash
    指定ip和容器端口:docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
    指定ip宿主机端口容器端口:docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署

创建映射80端口的交互式容器

docker run -p 80 --name web -i -t ubuntu /bin/bash

安装Nginx

apt-get install -y nginx

安装文本编辑器vim

apt-get install -y vim

创建静态页面

mkdir -p /var/www/html
cd /var/www/html
vim index.html

修改nginx配置文件

vim /etc/nginx/sites-enabled/default

把root改为静态网站的位置

运行Nginx

nginx

查看容器端口映射情况docker port 容器名

验证网站访问

浏览器打开: 主机ip:端口

Docker镜像

查看和删除镜像

查看docker存储驱动和存储位置

命令:docker info列出镜像

列出镜像

命令: docker images [option] [REPOSITORY]

  • 无参数显示所有镜像详细信息
  • +仓库名返回对应所有镜像
  • -a,—all=false 所有镜像
  • -f,—filter=[] 显示时过滤条件
  • —no-trunc 指定不使用阶段的方式显示数据
  • -q,—quit=false 只显示镜像唯一id

返回信息:

  • REPOSITORY:镜像所属仓库名(一系列镜像的集合)
  • TAG:镜像标签名(默认使用latest对应的镜像)
  • IMAGEID: 镜像唯一id(截断过)
  • CREATED: 镜像创建时间
  • VIRTUAL: 镜像大小

查看镜像的详细信息

命令: docker inspect [options] container|image [container|]

  • -f,—format=””

例如:docker inspect ubuntu:latest

删除镜像

命令: docker rmi [options] IMAGE [image…]

  • -f,—force=false 强制删除镜像
  • —no-prune=false 保留删除镜像中未打标签的父镜像
    例如: docker rmi ubuntu:14.04
    例如: docker rmi ${docker images -q ubuntu}删除仓库中所有镜像

注意一个镜像可能会有多个tag

获取和推送镜像

查找镜像

docker Hub https://registry.hub.docker.com
使用前要注册dockerhub
命令: docker search [options] term

  • —automated=false 只显示自动化构建出的镜像
  • —no-trunc=false 不以截断的方式输出
  • -s,—star=0 限定显示结果的最低星级

例如: docker search ubuntu

拉取镜像

命令: docker pull [options] name:[:tag]

  • -a,—all-tags=false 把仓库中所有匹配到的镜像下载到本地

推送镜像

命令: docker push name[:TAG]

构建Docker镜像(保存对容器的修改并再次使用)

使用commit 构建镜像

命令:docker commit [options] container [repository [:TAG]]

  • -a,—author=”” 指定作者
  • -m,—message=”” 镜像构建的信息
  • -p,—pause=true 暂停正在运行的容器

例如: docker commit -a ccc -m ‘nginx’ commit_test(容器) xxx/commit_test1(镜像名)

使用build构建镜像

命令: docker build 通过Dockerfile文件构建

创建dockerfile文件
1
2
3
4
5
6
7
# first Dockerfile for test

FROM ubuntu:14:04
MAINTAINER jxhacker "977242261@qq.com"
RUN apt-get upadte
RUN apt-install -y nginx
EXPOSE 80
使用docker build [options] PATH|URL|-进行构建
  • —force-rm=false
  • —no-cache=false
  • —pull=false
  • -q,—quiet=false
  • —rm=true
  • -t,—tag=”” 指定构建出镜像的名字

例如:docker build -t='jxhacker/df_test1' .

docker的C/S模式

docker的C/S模式

dockers的C/S模式 remote API

  • restful风格API
    docker的remoteAPI

连接方式

  • unix:///var/run/docker.sock(默认是客户端与守护进程通信方式)
  • tcp://host:port
  • fd://socketfd

完整的docker的CS模式

连接socket:nc -U /var/run/docker.sock

  • -U指明使用socket

docker守护进程的配置和操作

查看守护进程

命令: ps -ef|grep docker
命令: sudo status docker or systemctl status docker

使用service命令管理

命令:

  • sudo service docker start
  • sudo service docer stop
  • sudo service docker restart

    docker的启动选项

    命令: docker -d [options]

    • -D,—debug=false
    • -e,—exec-driver=”native”
    • -g,—graph=”/var/lib/docker”
    • —icc=true
    • -l,—log-level=”info”
    • —label=[]
    • -p,—pidfile=”var/run/docker.pid”

dcoker启动配置文件

位置:/etc/default/docker

Docker的客户端与守护进程的远程访问

  • 第二台安装Docker的服务器
  • 修改Docker守护进程启动选项,区别服务器(/etc/default/docker添加DOCKER_OPTS=”-label_name = docker_server_1”)
  • 保证ClientAPI和ServerAPI版本一致

修改服务器端配置

/etc/default/docker添加DOCKER_OPTS=”-label_name = docker_server_1 -H tcp://0.0.0.0:2375”

另一台主机访问

curl http://xx.xx.xx.xx:2375/info

修改客户端配置

docker -H tcp://xx.xx.xx.xx:2375 info
也可以使用环境变量DOCKER_HOST
export DOCKER_HOST="tcp://xx.xx.xx.xx:2375"
使用完置空那个环境变量
export DOCKER_HOST=""

docker容器的网络网络基础

Linux虚拟网桥

  • 可以设置ip地址
  • 相当于拥有一个隐藏的虚拟网卡

docker修改docker0地址

命令: ifconfig docker0 192.168.200.1 netmask 255.255.255.0

自定义虚拟网桥

添加虚拟网桥
  • sudo brctl addr br0
  • sudo ifconfig bro 192.168.100.1 netmask 255.255.255.0
    更改dockers守护进程的启动配置
  • /etc/default/docker 中添加DOCKER_OPTS值
  • -b=br0

docker 容器的互联

docker运行容器互相连接

--icc=truedocker运行容器互相连接

所有容器间连接

--link所有容器间连接
命令:docker run --link=[container_name]:[alias] [image] [command]
例如:docker run -it --name cct3 --link=cct1:webtest jxhacker/cct
这种方式即时重新启动容器ip改变还是能互联

运行特定容器间的连接

  • icc=false —iptable=true
  • —link
    这样就仅仅允许通过link配置的访问

    docker 容器与外部网络的连接

    ip_forward系统是否转发流量

    ip-forward=true守护进程启动时,设置系统的ip_forward
    sysctl net.ipv4.conf.all.forwarding查看数据转发是否开启

    iptables过滤防火墙系统

    filter表中包含的链
  • INPUT
  • FORWARD
  • OUTPUT

例如:sudo iptables -t filter -L -n

容器的数据管理

docker容器的数据卷

什么是数据卷

docker数据卷是经过特殊设计的目录,可以绕过联合文件系统,为一个或多个容器提供访问,它存在的目的在于数据的永久化,它完全独立于容器的生命周期,因此,Docker不会再容器删除时删除挂载的数据卷,也没有类似垃圾回收机制对容器引用的数据卷进行处理。

特点:

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间共享重用
  • 可以对数据卷中的数据直接修改
  • 数据卷的变化不会影响镜像的更新
  • 卷一直存在,即使挂载数据的容器已经被删除

为容器添加数据卷

命令: sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash

  • -v指定数据卷在本机文件系统中的目录和在容器中映射的目录名

例如:docker run -it -v ~/datavolumn:/data ubuntu /binbash

为数据卷添加访问权限

命令: docker run -v ~/datavolumn:/data:ro -it ubuntu /bin/bash

  • 只读权限

使用dockerfile构建包含数据卷的镜像

  • dockerfile指令:VOLUMN['/data']

构建完成后:docker run --name dvt3 -it jxhacker/dvt
其本地的docker路径自动创建

docker的数据卷容器

什么是数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器叫数据卷容器
Docker数据卷架构

使用数据卷容器

命令:docker run --volumns-from [CONTAINER NAME]

  • —volumns-from指定新建容器所指定的数据卷容器
  • [CONTAINER NAME]已经挂载数据卷的容器的容器名

例如:

  • docker run -it --name dvt4 jxhacker/dvt
  • docker run -it --name dvt5 --volumn-from dvt4 ubuntu /bin/bash

dockers数据卷备份与还原

数据备份方法

命令:

  • docker run --volumes-from [container name] -v $(pwd):/backup ubuntu
  • tar vcf /backup/backup.tar [container data volumn]

例如:

docker run --volumes-from dvt5 -v ~/backup:/backup:wr --name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolumne1   

数据还原方法

  • docker run --volumes-from [container name] -v $(pwd):/backup ubuntu
  • tar xvf /backup/backup.tar [container data volumn]
您的鼓励是我最大的动力!