一 理解
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
网友评论