docker从安装到基本使用

docker技术与入门实战

​ 读书笔记

简介

​ docker引擎的基础是linux容器(Linux Containers,LXC)技术。具有很多优势。自行百度

docker核心概念:

镜像:docker镜像类似于虚拟机镜像,镜像是创建docker容器的基础

容器:类似于一个轻量级的沙箱,docker利用容器来运行隔离应用;容器是从镜像创建的应用实例,可以将其启动、开始、暂停、删除。可以将容器当成一个独立的系统。

仓库 :docker仓库类似于git仓库,是docker集中存放镜像文件的场所。

docker安装

官方教程安装docker

https://docs.docker.com/install/linux/docker-ce/centos/

# 配置文件 /etc/sysconfig/docker
chkconfig docker on  # 加入开机启动
service docker start # 启动docker服务

由于docker镜像默认使用dockerhub,我们使用国内的配置加速镜像的下载
参考博客地址:
https://blog.csdn.net/lidai352710967/article/details/81118542

镜像

镜像是docker运行容器的前提

获取镜像

$ docker pull NAME[:TAG]

默认从dockerhub上获取镜像,如果不显示地指定TAG,则默认会选择latest标签,也就是下载仓库中最新的镜像

用户也可以从其他仓库下载镜像,例如从DockerPool社区的静香园下载最新的Ubuntu镜像。

$ docker pull dl.dockerpoll.com:5000/ubuntu

查看镜像信息

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
youkou1/fastdfs           latest              8487e86fc6ee        9 months ago        464MB
delron/elasticsearch-ik   2.4.6-1.0           095b6487fb77        9 months ago        689MB
  • 来自哪个仓库,比如 youkou1/fastdfs
  • 镜像的标签信息,比如 latest
  • 镜像的ID号(唯一)
  • 创建时间
  • 镜像大小

搜索镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索dockerhub

docker search python or reids

删除镜像

docker rmi IMAGE[IMAGE...]

其中IMAGE也可为标签或者ID(也可以是ID能区分的部分前缀串),docker rmi 命令指示删除了该镜像多个标签中的指定的标签,当本地只有一个标签是,该命令会彻底删除该镜像。

docker rmi youkou1/fastdfs:latest

当适用docker rmi 命令后面跟上镜像的ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像创建的容器存在是,镜像文件默认是无法被删除的。

我们要删除镜像,线删除该镜像依赖的所有容器,在删除镜像。

创建镜像

1、基于已有镜像容器创建

命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要选项包括:

  • -a, --author="" 作者信息。
  • -m, --message="" 提交信息
  • -p,–pause=true 提交是暂停容器运行
$ docker run -ti ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/#  touch test
root@a925cb40b3f0:/#  exit

该容器和原来的镜像相比已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或者名称来指定容器

$ docker commit -m "create new docker image" -a "masicro" bd3a2880e03f test
sha256:44305b8cbe66182aecd759f81f2d053f314ec59bb801319585c03d01cc076894
$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
test                      latest              44305b8cbe66        12 seconds ago      464MB
youkou1/fastdfs           latest              8487e86fc6ee        9 months ago        464MB
delron/elasticsearch-ik   2.4.6-1.0           095b6487fb77        9 months ago        689MB
2、基于本地模版导入

首先下载一个镜像

$ cat ubuntu-14.04-x86_64-minimal.targz
$ docker import - ubuntu:14.04
$ docker images   # 可以看到镜像
3、存出和载入镜像

​ 可以使用docker save 和 docker load 命令来存出和载入镜像

存出镜像

将镜像保存到本地

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
test                      latest              44305b8cbe66        2 hours ago         464MB
youkou1/fastdfs           latest              8487e86fc6ee        9 months ago        464MB
delron/elasticsearch-ik   2.4.6-1.0           095b6487fb77        9 months ago        689MB
$ docker save -o test.tar test:latest

-o, --output string Write to a file, instead of STDOUT

可以使用docker load 从本地文件在导入到本地镜像库

$ docker load --input test.tar
$ docker load < test.tar

上传镜像

使用docker pull 命令上传镜像到仓库,默认上传到dockerhub官方仓库

命令格式: docker pull NAME[:TAG]

注意:第一次上传会提示输入登陆信息或注册

容器

新建容器

​ 可以使用docker create命令创建一个容器

$ docker create -it test:latest

使用docker create 创建的容器处于停止状态,可以使用docker start命令来启动它。

新建并启动容器

容器启动有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将终止状态的容器重新启动。所需要的命令主要是docker run,等价于先执行docker create命令,在执行docker start命令。

当利用docker run 来创建并启动容器是,docker在后台运行的标准操作包括:

  • 检查本地是否存在指定镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中
  • 从地址次配置一个IP地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

下面命令则启动一个bash终端,允许用户进行交互:

$ docker run -t -i test:latest /bin/bash

其中

  • -t 选项让docker分配一个为终端(pseudo-tty)并绑定到容器的标准输入上,
  • -i 选项则让容器的标准输入保持打开
  • -d 选项,让容器以daement方式运行

终止容器

​ 可以使用docker stop来终止一个运行中的容器

命令格式:docker stop [-t |–time[= 10]]。他会首先向容器发送SIGTERM信号,等待一段时间后(默认10s),在发送SIGKILL信号终止容器。

​ 此外当docker容器中指定的应用终结是,容器也自动终止。

进入容器

​ 在使用-d参数时,容器会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有很多方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等

attach命令

​ docker attach是docker自带的命令

$ docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS               NAMES
bd3a2880e03f        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                              storage
3e8893684da1        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                              tracker
a645ecf4e183        delron/elasticsearch-ik:2.4.6-1.0   "/docker-entrypoint.…"   7 weeks ago         Up 5 weeks                              elasticsearch
$ docker attach elasticsearch

​ 使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候们所有的窗口都会通不显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

exec命令

docker自1.3版本起,提供了更加方便的工具exec,可以直接在容器内运行命令

$ docker exec -ti a645ecf4e183 /bin/bash
nsenter工具(未完成)

删除容器

可以使用docker rm 命令删除处于终止状态的容器,命令格式为docker rm [OPTIONS] CONTAINER [CONTAINER…],其中支持的选项

  • -f,–force=false 强行终止并删除一个运行中的容器
  • -l,–link=false 删除容器的链接,但保留容器
  • -v,–volumes=false删除容器挂载的数据卷

如下,查看处于终止状态的容器,并删除

$ docker ps -a 
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                     PORTS               NAMES
29ba88dfc511        hello-world                         "/hello"                 10 seconds ago      Exited (0) 8 seconds ago                       relaxed_noether
bd3a2880e03f        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                                     storage
3e8893684da1        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                                     tracker
a645ecf4e183        delron/elasticsearch-ik:2.4.6-1.0   "/docker-entrypoint.…"   7 weeks ago         Up 5 weeks
$ docker rm 29b
29b
$ docker ps -a
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS               NAMES
bd3a2880e03f        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                              storage
3e8893684da1        youkou1/fastdfs                     "/usr/bin/start1.sh …"   3 weeks ago         Up 3 weeks                              tracker
a645ecf4e183        delron/elasticsearch-ik:2.4.6-1.0   "/docker-entrypoint.…"   7 weeks ago         Up 5 weeks                              elasticsearch

要强制删除一个容器

$ docker rm -f CONTAINER_ID 

导入和导出容器

​ 导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,命令格式:docker export CONTAINER

$ docker export a64 >test_elastic.tar
$ ls 
 test_elastic.tar

导入容器

导出的文件又可以使用docker import 命令导入,称为镜像

$ docker import test_elastic.tar test/elastic:v1.0

使用docker load导入镜像和使用docker import导入镜像的区别:

​ 容器快照文件将丢弃所有的历史记录和元数据信息(仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外从容器快照文件导入时,可以重新制定标签等元数据信息。

小结:

​ 在生产环境中,由于容器自身轻量级特征,推荐使用时在容器前端引入HA(高可靠性)机制,例如使用HAProxy工具代理容器访问,这样容器出现故障时,可以快速切换到其他容器,还可以自动重启故障容器。

仓库

仓库是集中存放镜像的地方。仓库又分为公共仓库和私有仓库。

Docker Hub

​ Docker 官方维护的一个公共仓库,其中已经包括15000多个镜像。大部分的需求都可以通过Docker Hub中直接下载镜像来实现。

​ 可以使用docker login 命令来输入用户名、绵绵和邮箱来完成登陆注册,注册成功后,本地用户目录的.dockercfg中将保存用户的认证信息

基本操作

使用docker search 命令无须登陆,来查询官方仓库中的镜像,并利用docker pull命令下载到本地

$ docker search redis -s 50
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis               Redis is an open source key-value store that…   6663                [OK]                
bitnami/redis       Bitnami Redis Docker Image                      106                                     [OK]
sameersbn/redis                                                     76                                      [OK]
$ docker pull redis
自动创建

​ 自动创建对于需要经常升级镜像内程序的来说非常方便。

​ 配置自动创建,包含以下步骤:

  • 创建并登陆dockerhub,以及目标网站;*在目标网站中连接账户到dockerhub
  • 在dockerhub上配置一个自动创建
  • 选取一个目标网站中的项目(需要含dockerfile)和分支
  • 指定dockerfile的位置,并创建提交
  • 之后,可以砸docker hub的“自定创建”页面中跟中每次创建的状态

创建和使用私有仓库(未完成)

使用regisry镜像创建私有仓库

$ docker run -d -p 5000:5000 registry

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

默认会将仓库创建在容器的/tmp/registry目录下。可以通过 -v 参数将镜像文件存放到指定路径

$ docker run -d -p 5000:5000 -v /home/docker_data/registry:/tmp/registry registry

​ 此时,在本地将启动一个私有仓库服务,监听端口为5000

数据管理

​ 用户在使用docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享。

​ 容器管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volumes Dontainers)

数据卷

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性

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

数据卷的使用,类似于linux下对目录或文件进行mount操作

在容器中创建一个数据卷

​ 使用docker run命令时,使用 -v 标记可以在容器内创建 一个数据卷,多次使用可以创建多个

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

$ docker run -d -p --name web -v /webapp training/webapp python app.py
挂载一个本地主机目录作为数据卷
$ docker run -d -P --name web -v /str/webapp:/opt/webapp:ro training/webapp python app.py

​ 上面语句表示,将本地/str/webapp目录到容器的/opt/webapp目录,其中ro表示容器只读。docker挂载数据卷默认权限是读写(rw)。用户可以放置一些程序或者数据到本地目录中,然后在容器内部运行和使用

挂载本地主机文件作为数据卷

-v 标记也可以从主机挂载单个文件到容器中我作为数据卷

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

这样就可以记录在容器输入过的命令历史了

注意:如果挂载文件到容器,使用文件编辑工具编辑该文件时,恳会造成inode的改变,这回导致报错

数据卷容器(未完结)

​ 假如用户需要在容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器,数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。

​ 创建数据卷容器dbdata,从镜像Ubuntu中

$ docker run -it -v /dbdata --name dbdata CentOS

可以在其他容器中使用 --volumes-from 来挂载dbdata容器中的数据卷

# 创建db1,db2两个容器,并从dbdata容器中挂载数据卷
$ docker run -it --volumes-from dbdata --name db1 ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu

网络基础配置

docker目前提供了映射端口到宿主主机和容器互联来为容器提供网络

端口映射实现访问容器

从外部访问容器应用

​ 在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

​ 当容器中运行一些网络用用,要让外部访问这些应用时,可以通过-P或-p参数;当适用-P 时,docker会随机映射一个49000~49900的端口值容器内部开放的网络端口:

-p则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器

映射所有接口地址

适用hostPort:containerPort 格式将本地5000端口映射到容器5000端口

$ docker run -d -p 5000:5000 redis 
# 也可以绑定多个ip
$ docker run -d -p 5000:5000 -p 3000:80 redis
映射到指定地址的指定端口

可以使用ip:hostPort:containerPort 格式指定

$ docker run -d -p 127.0.0.1:5000:5000 redis 
映射到指定地址的任意端口

使用ip::containerPort 绑定localhost的任意端口到容器的5000端口,本地主机自动分配一个端口

$ docker run -d -p 127.0.0.1::5000 redis
查看映射端口配置

​ 使用docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

$ docker port redis

注意:

容器有自己的内部网络和IP地址(使用docker inspect + 容器ID可以获取所有的变量值)

容器互联实现容器件通信

​ 容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。他会在源和接收容器之间创建一个隧道,接收容器可以看到元容器指定的信息。

自定义容器命名

​ 连接系统依据容器名称来执行。因此需要自定义一个好记的容器名称

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

上面命令表示,创建了一个名叫web的容器,方便使用

​ 在执行 docker run 时,如果添加 --rm 标记时,则容器终止后会立刻删除。–rm 和 --d不能同时使用

容器互联

​ 使用 --link 参数可以让容器之间安全的进行交互。

首先创建一个新的容器web1

$ docker run -ti -d --name web1 centos

在创建一个web2容器,并将它连接到web1容器

$ docker run -it -d --name web2 --link web1:web1 centos
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值