Docker 初识
一、Docker 简介
Docker是一个开源的应用容器,用户可以将web程序和服务打包到一个轻量级、可以移植的容器中,然后发布到任务流行的Linux服务器上,实现虚拟化。同时完全是沙箱操作,即Docker内部是一个沙箱操作,项目之间不会有任何接口,并且开销极低。
二、Docker(centos)安装
1. 移除旧的Docker服务
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2. 安装必要的参数
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 设置软件源的来源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4. 更新yum缓存
sudo yum makecache fast
5. 安装 Docker-ce
sudo yum -y install docker-ce
6. 启动
sudo systemctl start docker
7. 设置开机启动
chkconfig docker on
8. 测试运行 hello-world
docker run hello-world
9. 镜像加速,在 /etc/docker/daemon.json中添加下面的内容,没有改文件,则创建该文件。
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 国内加速镜像
# 网易加速器:http://hub-mirror.c.163.com
# 官方中国加速器:https://registry.docker-cn.com
10. 删除Docker CE
sudo yum remove docker-ce
sudo rm -rf /var/lib/docker
三、Docker 基础
Docker重要的基础概念:仓库,镜像,容器
- 仓库:注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像,很多人会把仓库与registry混为一谈,其实registry是存放repository的地方,仓库分为公有仓库与私有仓库;
- 镜像:Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。
- 容器:似于一个轻量的沙箱,docker利用容器来运行和隔离应用;容器是从镜像创建的应用运行的实例;容器从镜像启动的时候,docker会在镜像的最上层创建一个可写层,镜像本身保持不变;容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。可以从一个镜像创建无数个容器。平时我们主要操作的就是容器。我们也可以把容器打包成镜像以方便再次使用。镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。
以前部署一个程序nginx,会进入到linux服务器上,下载nginx程序,然后运行。如果现在有一个镜像,该镜像就像是虚拟机一样的一个镜像文件,该文件运行起来,和那个nginx部署在linux服务器环境一样,nginx程序也在其中,然后运行该镜像中的已经存在的nginx程序,这个时候可以叫他容器,运行该容器后nginx就启动起来了。
hub中央仓库是一个公共的库,可以创建账号之后,将自己的内容推送到上面,https://hub.docker.com/注册自己账号
四、Docker命令
1. 基础命令
docker ps -- 查看当前运行在容器中的程序
docker pull image_names -- 拦截镜像文件 image_name镜像文件的名称
docker images -- 查看当前容器中的镜像文件
docker rmi imageName --删除镜像文件
2. 案例:
- 运行程序
docker pull training/webapp --拉取镜像
docker run -d -P training/webapp python app.py --运行程序
-d 让容器在后台中运行
-P 将程序端口映射到主机上 - 添加自己的hub上账号
sudo docker login
Username: ***
Password:
Email: ***
- 使用Dockerfile来构建自己的镜像
1. mkdir workdir
2. cd workdir
3. touch Dockerfile 添加如下内容:
# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Wangzhe0912 "Wangzhe0912@tju.edu.cn"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "Hi, I am your contrainer" > /usr/share/nginx/html/index.html
EXPOSE 80
代码含义:
1.每个Dockerfile的第一行指令都应该是FROM开头。FROM用于制定一个已经存在的镜像,后续指令都是基于该镜像来运行。这个镜像我们称之为基础镜像。
2.MAINTAINER后说明该作者和作者邮箱信息。
3.接下来是三条RUN指令。默认情况下,指令后的内容会通过/bin/sh -c来执行。
4.最后设置了EXPOSE,该指令用于指定容器内的应用程序会使用哪些端口(可以指定多个)。PS:出于安全考虑,默认Docker不会自动打开这些端口,
5.需要在docker run指令中指定需要打开的端口
4.构建镜像
docker build -t="wangzhe0912/nginx:v1"` . (后面有一个点,表示执行当前目录下的Dockerfile文件,-t="wangzhe0912/nginx:v1"指定了新生成镜像的镜像名称,也可以从git仓库中寻找docker build -t="wangzhe0912/nginx:v1"` git@github.com:wangzhe0912/docker_web)
Dockerfile构建的好处是如果某一步执行失败了,以前面的镜像存储于缓存中,如果再次构建时会利用该缓存,如果不想,则执行
sudo docker build --no-cache -t="wangzhe0912/nginx:v1" .
如果想利用缓存,则需要在第一个RUN之前指定: ENV REFRESHED_AT 2018-01-28该命令行。如果该缓存变化了,则重新构建,如果没有变化,则会利用该缓存中的镜像。
如下:
# Version: 0.0.1
FROM ubuntu:14.04
ENV REFRESHED_AT 2018-01-28
MAINTAINER Wangzhe0912 "Wangzhe0912@tju.edu.cn"
RUN apt-get update
5.将镜像推送到hub仓库中 sudo docker push wangzhe0912/nginx
五、优势和使用场景
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:
- Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
- Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
- Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
- Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。