docker学习之镜像容器基本操作

一 理解

Docker可以创建一个可移植的轻便的虚拟操作系统环境,然后可以将应用移植在这个虚拟环境中,这样以后部署的时候就可以直接将这个虚拟环境生成的镜像移植到服务器上,这样就不需要再在服务器上安装相关的依赖环境.

  • 应用场景
    web应用的自动化打包和发布
    自动化测试和持续集成、发布
    在服务型环境中部署和调整数据库或其他的后台应用

  • 镜像
    docker镜像同普通的操作系统的镜像概念差不多,其本质是一个文件,是用来创建容器的基础
    容器:

  • 容器
    容器类似于一个操作系统,其是基于镜像制作而成,是镜像的一个实例,可以运行程序及相关读写操作,一个镜像可以创建多个容器,一个容器属于一个镜像.容器也可以制作成镜像.
    经测试,容器的硬件参数同宿主主机的一样

二 Docker安装与常用命令

1 安装docker(ubuntu)

sudo apt-get update && apt-get install docker && adocker.io

1.1 查看是否安装成功

sudo docker info

2 docker镜像

2.1 搜索并下载镜像

这里的镜像是从docker的官方镜像网站进行搜索和下载的 www.docker.io

2.2 搜索镜像:

sudo docker search <镜像名称>
例如: sudo docker search centos

2.3 下载镜像:

如果有搜索到镜像,那么就可以通过名称来下载该镜像

sudo docker pull <镜像名称>

2.4 查看自己拥有的镜像

sudo docker images

2.5 删除镜像

删除镜像前需要先删除该镜像衍生的容器,而后删除镜像

sudo docker rmi [镜像id|镜像名称]

  • 据说使用如下命令可以删除所有镜像
    docker rmi $(docker images -q)

2.6 打包镜像到本地

sudo docker save [镜像名称]> [打包后的存储路径]

2.7 将导出的镜像再导入

docker load < 镜像文件路径

2.8 给镜像添加tag:

tag是给镜像添加的标签,类似于版本号,在创建镜像的时候,若没有指定镜像tag,那么其tag将是默认值latest.

tag的修改方式:

docker tag -f ubuntu:1.0ubuntu:2.0

3 容器操作

3.1 创建并启动容器

docker run -i -t -v /home/test/:/home/test/ --name webflask ubuntu/bin/bash

这条命令比较长,稍微分解一下,包含以下三个部分:

docker run <相关参数> <镜像 ID> <初始命令>

其中,相关参数如下:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-v 表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6

初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。

创建不启动容器使用关键字 create,其使用方式同run一样

3.2 退出容器:

exit

3.3 查看后台容器:

sudo docker ps [-a 查看所有(包括未运行)的容器]

列表参数含义:
CONTAINER ID IMAGE COMMANDCREATED STATUS PORTS NAMES
这些分别代表什么
CONTAINER ID:容器ID,唯一标识容器
IMAGE:创建容器时所用的镜像
COMMAND:在容器最后运行的命令
CREATED:容器创建的时间
STATUS:容器的状态(你会看到UPXXX,表示运行状态)
PORTS:对外开放的端口号
NAMES:容器名(也具有唯一性,docker是不允许创建容器名相同的容器的)

3.4 启动容器:

sudo docker start [容器名|容器ID]

3.5 进入已启动的容器的shell:

sudo docker exec –it [容器名|容器ID] bash

3.6 结束容器:

sudo docker stop [容器名|容器ID]

3.7 重启容器:

sudo docker restart [容器名|容器ID]

3.8 删除容器

sudo docker rm [容器名|容器ID]

据说使用如下命令可以删除所有容器

docker rm $(docker ps -q -a)

3.9 修改容器名称:

docker rename old容器名 new容器名

3.10 容器导出:

sudo docker export [容器ID|容器名称]> 导出的路径

将导出的容器导入为镜像:

cat 容器文件路径 | sudo dockerimport – 需要导到的仓库名/镜像名称

3.11 容器的端口映射:

3.11.1创建时:

-p:可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。
支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort

sudo docker run -p 8080:80 ubuntu

上面代码将容器的80端口映射到宿主主机的8080端口

-P:当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
sudo docker run -P 80 ubuntu

上面的代码将会把80端口映射到宿主主机的一个随机端口,可以使用 sudo docker ps来查看主机的端口映射情况.

若要创建多个端口映射,可以重复使用 -p或者-P

3.11.2 创建后:

   找了很多资料.都说不建议创建后修改端口映射,如果因为特殊情况需要后期修改端口映射,则有两种方法,一是将当前容器制作成镜像,二是采取如下方法:

   执行如下命令查看该容器的ip:

docker inspect [容器名称] | grep IPAddress

   执行如下命令将该容器的8080端口映射到宿主主机的7001端口,需要注意的是,映射后只有通过该主机的ip来访问,无法通过localhost:port来访问

iptables -t nat -A DOCKER -ptcp --dport 7001 -j DNAT --to-destination [容器ip]:8000

3.12 将容器制作成镜像:

sudo docker commit [容器名称|容器id] [仓库名]/[镜像名]

4 镜像仓库的制作

安装docker

apt-get install docker.io

安装docker-compose

apt-get install docker-compose

去docker的官方仓库下载用于搭建私有仓库的镜像

sudo docker pull registry

创建容器

sudo docker run -d -p 7777:5000 -v/home/docker/:/tmp/registry registry

在服务器上完成以上步骤后私有仓库就搭建完成了

将本地项目push到远程仓库中

首先将本地镜像添加tag,tag的开头是服务器的host:port,如下

sudo docker tag ubuntu:v1 106.14.205.170:7777/ubuntu:v2

因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。为了解决这个问题需要创建文件/etc/docker/daemon.json,里面内容如下:

$ sudo vi /etc/init/docker.conf

添加

{
   "insecure-registries": [
       "106.14.205.17:7777"
    ]
}
//多个私服写法,逗号分隔即可
{
   "insecure-registries": [
       "test.docker.jiankunking.io:5000",
       "106.14.205.170:7777"
    ]
}

然后重启docker

systemctl restart docker

将修改的tag传到服务器中:

sudo docker push 106.14.205.170:7777/ubuntu:v2

5 容器内项目示例

(使用python3.5环境下的flask库模拟搭建一个小型web服务器):

创建容器(将内网8080端口映射到7001)

docker run -i -t –v –p 7001:8080 /home/test/:/home/test/ubuntu /bin/bash

安装相关的库

apt-get update &&apt-get install vim&&apt-get install wget&&apt-get install python3.5 && apt-get python3-pip -y

安装python依赖库
pip3 install flask

创建服务器

cd /home/
vim api.py

里面添加服务器代码

from flask import Flask
app=Flask(__name__)
@app.route("/",methods=["GET","POST"])
def index():
    return "hello"
app.run(host="0.0.0.0",port=8080)

保存后,后台运行代码:
nohup python3.5 api:app &

退出docker
exit
访问测试,在外部的宿主浏览器上输入http://127.0.0.1:7001/,如果成功的话将会显示hello

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启...
    执笔梦一场阅读 3,207评论 2 10
  • 测试环境:Ubuntu 16.04 LTS Linux 4.16.0-999-generic shell版本...
    molscar阅读 332评论 1 2
  • 近来发现docker越来越受欢迎了,而且看起来,docker的热度还远没有到达顶峰,或许在这个云服务时代的大背景下...
    尽情的嘲笑我吧阅读 517评论 0 5
  • 一直有听说哈勃望远镜!没想到它是如此的牛逼! 它是直接嫁接到大气层之外,没有干扰的位置! 它用了近十年组装,耗费了...
    乌龟的慢生活阅读 278评论 0 0
  • 一、决策树初识 决策树感性的理解就是通过构建一系列的规则把满足一定条件的数据划分到同一节点。贷款申请表 二、特征选...
    charmler阅读 437评论 0 0