docker学习

 

Docker学习

理解

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

应用场景:

web应用的自动化打包和发布;

自动化测试和持续集成、发布;

在服务型环境中部署和调整数据库或其他的后台应用;

镜像:

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

容器类似于一个操作系统,其是基于镜像制作而成,是镜像的一个实例,可以运行程序及相关读写操作,一个镜像可以创建多个容器,一个容器属于一个镜像.容器也可以制作成镜像.

经测试,容器的硬件参数同宿主主机的一样

安装docker(ubuntu)

首先更新下载源:

sudo apt-get update

安装docker

sudo apt-get install docker && adocker.io

查看是否安装成功

sudo docker info

搜索并下载镜像

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

搜索镜像:

sudo docker search 镜像名称

例如: sudo docker search centos

下载镜像:

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

sudo docker pull 镜像名称

查看自己拥有的镜像

sudo docker images

删除镜像

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

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

据说使用如下命令可以删除所有镜像

docker rmi $(docker images -q)

打包镜像到本地

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

将导出的镜像再导入:

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

给镜像添加tag:

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

tag的修改方式:

docker tag -f ubuntu:1.0ubuntu:2.0

 

容器操作

创建并启动容器

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一样

退出容器:

exit

查看后台容器:

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

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

启动容器:

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

进入已启动的容器的shell:

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

结束容器:

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

重启容器:

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

删除容器

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

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

docker rm $(docker ps -q -a)

修改容器名称:

docker rename old容器名    new容器名

容器导出:

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

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

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

容器的端口映射:

创建时:

-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

创建后:

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

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

docker inspect [容器名称] | grep IPAddress

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

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

将容器制作成镜像:

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

镜像仓库的制作

安装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

容器内项目示例

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

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

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

安装wget vim

apt-get update

apt-get install vim

apt-get install wget

安装python3.5

apt-get install python3.5

安装setuptools和flask

wget https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26

tar –xzvf setuptools-19.6.tar.gz

cd setuptools-19.6

python3.5 setup.py build

python3.5 setup.py install

 

wget https://pypi.python.org/packages/eb/12/1c7bd06fcbd08ba544f25bf2c6612e305a70ea51ca0eda8007344ec3f123/Flask-0.12.2.tar.gz#md5=97278dfdafda98ba7902e890b0289177

tar –zxvf Flask-0.12.2.tar.gz

cd Flask-0.12.2

python3.5 setup.py install

创建服务器

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值