关于Docker
Docker 是 Docker 公司的开源项目,使用 Google 公司推出的 Go 语言开发的,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护,大概在2017年4月份左右Docker项目突然改名为Moby,所以在Github搜索Moby才可以找到这个项目。
Docker的内核建立在LXC(Linux Container)之上,作为容器的一种,同传统的虚拟机比起来,容器内的应用/进程直接运行在宿主机的内核上,容器没有自己的内核,所以容器更加轻量,运行效率也更高。
同传统的虚拟机相比:
- 更高效的资源利用
- 快速启动时间
- 一致的运行环境
- 持续交付和部署
- 轻松迁移
- 轻松维护和扩展
Docker 概念
在Docker上包含如下几个重要概念
- 镜像 Image
- 容器 Container
- 仓库 Repository
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker容器是Docker镜像的实例,镜像启动后可生成一个Docker实例,当然也可以将Docker实例保存为一个镜像,供其他用户使用。
Docker仓库是保存Docker镜像的地方,Docker的默认镜像仓库是在hub.docker.com
,但用户只能在官网创建一个private
项目,有些组织并不希望自己的镜像成为public
项目(比如打包了云源码),这时用户可以使用registry
构建自己的仓库。
Docker常用命令
本人使用的机器操作系统为ubuntu 16.04.1
,以下docker的使用均是建立在该操作系统上,如果是windows和mac的操作系统,可以在官方下载相应的软件。
安装docker
sudo apt install docker
Docker 取消 sudo
在使用docker 每次都要敲sudo ,可以使用如下命令取消
1.创建docker组:sudo groupadd docker
2.将当前用户加入docker组:sudo gpasswd -a ${USER} docker
3.重启服务:sudo service docker restart
4.刷新[Docker](http://lib.csdn.net/base/docker)成员:newgrp - [docker]
Docker 安装信息
使用docker info 查看docker的安装信息
docker info
docker info.png
Docker 查找和下载镜像
查找镜像
docker search [镜像名称]
下载镜像
docker pull [镜像名称]
docker search nginx.png
包含:NAME(镜像名称),DESRIPTION(描述),STARS(赞数量),OFFICIAL(是否是官方镜像),AUTOMATED(是否是自动构建镜像)。
一般我们倾向于下载赞数量比较大的官方镜像
设置Docker Hub镜像站点/加速器
因为docker默认的仓库在docker.io
,所以有时间下载的速度比较慢,可以通过设置镜像代理站点/加速器的方式来对下载加速,我使用了阿里云的镜像代理。
在阿里云创建Docker Hub镜像站点以后,可按照操作文档配置daemon.json文件,配置完毕,再次下载docker镜像就非常快了;因为docker 会优先从镜像站点下载。
阿里Docker Hub镜像站点.png查看镜像
查看本地已经下载的镜像
docker images
docker images.png
显示的列包括:本地镜像名称,版本,镜像ID,创建事件,大小
导出镜像
使用如下命令可以将镜像导出到当前目录
docker save centos > centos.tar
导入镜像
在当前目录中导入镜像
docker load < centos.tar
删除镜像
docker rmi [镜像名称]
- -f 强制删除
创建并启动容器
创建并启动一个centos容器
docker run -i -t centos /bin/bash
参数解释
- -i 选项:容器启动后,打开标准输入设备(STDIN),可使用键盘输入
- -t 选项:容器启动后,分配一个为终端,将与服务器建立一个会话
- centos 参数:需要运行的镜像名称,标准格式为centos:latest, 若为latest版本,则可忽略
- /bin/bash 表示容器中bash应用程序
该命令首先从本地获取镜像,本地没有镜像,则从Docker Hub拉取放到本地。
再看一个使用docker启动jenkins的例子:
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --link gitlab:gitlab.bill.com -u root
-v ~/jenkins:/var/jenkins_home -v /usr/share/maven:/usr/local/maven
-v /usr/lib/jvm/jdk1.8:/usr/local/jdk jenkinsci/jenkins:latest
参数解释:
- -p: 端口映射,将宿主机的端口映射到容器端口,前为宿主机端口,后为容器端口
- -v: 宿主机目录与容器目录映射
- -link: 会在容器/etc/hosts创建域名映射
- name:容器命名
列出容器
docker ps -a
- -a 所有容器
- -i 最近创建的容器
- -n 列出n个最近创建的容器
- -q 仅列出CONTAINER_ID 字段
- -s 在输出表格中增加一个SIZE字段,用于描述容器的大小
进入容器
docker attach [容器ID]
前提条件是容器已经启动
执行命令
docker exec -i -t [容器id] ls -l
和docker run命令类似,进入容器并列出容器的目录结构
停止容器
docker stop [容器id]
使用该命令对容器发送SIGTERM信号,将等待一段很短的事件,再对容器发送SIGKILL信号,立即终止容器
终止容器
docker kill [容器id]
使用该命令对容器发送SIGKILL信号,立即终止容器
启动容器
docker start [容器id]
启动已经停止的容器
重启容器
docker restart [容器id]
重启在运行的容器(前提条件容器已经启动),如何修改了容器内的配置文件,需要重启容器
删除容器
docker rm [容器id]
删除容器,前提条件是容器已经停止
批量删除:
docker rm -f $docker ps -a -q
或者
docker rm -f `docker ps -a - `
导出与导入容器
docker export [容器id] > xxxx.tar
在打包的文件在另一台机器上导入为镜像
docker import xxx.tar billjiang/xxxx:lastest
推送镜像
docker push billjiang/java
当我们在本地创建了镜像后,可以将它推送到镜像仓库,默认是推送到Docker hub,默认的地址是docker.io/biljiang/java
Dockerfile
Docker为我们提供了一个叫做Dockerfile的脚本文件,将命令写入该文件中,可以批量执行docker命令,构建镜像。
比如我们写一个构建带有jdk环境的镜像
Dockerfile内容
FROM centos:latest
MAINTAINER "billjiang"<475572229.qq.com>
ADD jdk1.8.tar.gz /opt
RUN ln -s /opt/jdk1.8 /opt/jdk
CMD /opt/jdk/bin/java -version
在Dockerfile的目录中执行docker build -t [容器名称] .
即可构建镜像。
(具体Dockerfile命令请自行学习,查看官网)
Docker仓库
考虑到我们的镜像不想在Docker hub中公开,我们可以使用registry
做私有镜像注册中心。
搭建Docker Registry:
docker run -d -p 5000:5000 -v ~/docker-registry:/tmp/registry registry
如果要把镜像推送到这个地址(在这里是本地地址http://127.0.0.1:5000
),需要更改镜像的名称。
docker tag [镜像id] 127.0.0.1:5000/billjiang/java
使用push命令即可将该镜像推送到私有镜像中心
docker push 127.0.0.1:5000/billjiang/java
以上是docker的搭建和使用的总结。
网友评论