Docker镜像
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)。
镜像操作:
1. 搜索镜像
docker search nginx # 从 Docker Hub 查找具有 nginx 关键字的镜像.
2. 下载镜像
此命令用来从仓库获取需要的镜像
docker pull nginx # 从 docker hub 的nginx 仓库下载 nginx 镜像到本地.
[root@localhost ~]# docker images # 查看本地的 docker 镜像,TAG 信息用来标记来自同一个仓库的不同镜像。 REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 568c4670fa80 2 weeks ago 109MB 仓库名 标签 镜像ID
3. 修改镜像仓库名和Tag 名称
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
[root@localhost ~]# docker tag 568c4670fa80 bushaoxun/nginx:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE bushaoxun/nginx latest 568c4670fa80 2 weeks ago 109MB nginx latest 568c4670fa80 2 weeks ago 109MB
4. 创建镜像
通过容器创建镜像
docker commit -m “指定提交的说明信息” -a "指定更新的用户信息" 容器ID 镜像的仓库名:tag # 创建成功后返回镜像 ID 信息.
[root@localhost ~]# docker commit -m "nginx-dev" -a "bushaoxun" b6c542a22efc shaouxn/nginx-dev:v1 sha256:26546368ce8387ffef823e16b7712d4b29a9bd996f85966eaeca8c264a2650d9 #镜像ID [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE shaouxn/nginx-dev v1 26546368ce83 13 seconds ago 109MB bushaoxun/nginx latest 568c4670fa80 2 weeks ago 109MB nginx latest 568c4670fa80 2 weeks ago 109MB
利用Dockerfile来创建镜像
1. 新建一个目录和一个 Dockerfile 文件
2 . 进入目录并编写 Dockerfile 文件
# This is a comment FROM bushaoxun/nginx # 基于哪个镜像创建 MAINTAINER bushaoxun # 维护者的信息 RUN mkdir -p /var/www/html # 创建中在容器中执行的命令
3. 创建镜像
# docker build 指定仓库名和标签名 [root@localhost newimage]# docker build -t="bushaoxun/nginx:v1" . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM bushaoxun/nginx:latest ---> 568c4670fa80 Step 2/3 : MAINTAINER bushaoxun ---> Running in 6130257ff12b Removing intermediate container 6130257ff12b ---> e480b4783294 Step 3/3 : RUN mkdir -p /var/www/html ---> Running in d46920df7e5d Removing intermediate container d46920df7e5d ---> 593d8fbe1711 # 查看创建的镜像 [root@localhost newimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE bushaoxun/nginx v1 593d8fbe1711 9 seconds ago 109MB nginx latest 568c4670fa80 2 weeks ago 109MB bushaoxun/nginx latest 568c4670fa80 2 weeks ago 109MB
4. 从本地文件系统导入镜像
要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates
#下载文件系统 wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz #从下载的文件系统导入成为镜像 cat centos-7-x86_64.tar.gz | docker import - centos:v1 #查看导入的镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos v1 0d3ef3a9e423 10 seconds ago 589MB
5. 存出和载入镜像
存出镜像:docker save -o centos.tar centos:v1 # 保存镜像到本地文件
载入镜像: docker load --input centos.tar # 从本地文件中再导入到本地镜像库,这将导入镜像以及其相关的元数据信息(包括标签等)。
容器操作
容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
1. 新建容器
容器是基于镜像创建的。
#启动一个Bash终端,允许用户进行交互创建容器. # -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标 准输入保持打开。 docker run -it centos:v1 /bin/bash #让 Docker容器在后台以守护态(Daemonized)形式运行 docker run -itd centos:v1 /bin/bash
2. 启动停止容器
docker start 容器名或者ID #启动容器
docker stop 容器名或者ID #停止容器
3. 进入容器
仅介绍 .bash_docker 的方式
编写 .bashrc_docker 文件,内容如下:
# Some useful commands to use docker. # Author: yeasy@github # Created:2014-09-25 alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'" alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'" #the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter function docker-enter() { #if [ -e $(dirname "$0")/nsenter ]; then #Change for centos bash running if [ -e $(dirname '$0')/nsenter ]; then # with boot2docker, nsenter is not in the PATH but it is in the same folder NSENTER=$(dirname "$0")/nsenter else # if nsenter has already been installed with path notified, here will be clarified NSENTER=$(which nsenter) #NSENTER=nsenter fi [ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return if [ -z "$1" ]; then echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]" echo "" echo "Enters the Docker CONTAINER and executes the specified COMMAND." echo "If COMMAND is not specified, runs an interactive shell in CONTAINER." else PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1") if [ -z "$PID" ]; then echo "WARN Cannot find the given container" return fi shift OPTS="--target $PID --mount --uts --ipc --net --pid" if [ -z "$1" ]; then # No command given. # Use su to clear all host environment variables except for TERM, # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH, # and start a login shell. #sudo $NSENTER "$OPTS" su - root sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root else # Use env to clear all host environment variables. sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i $@ fi fi }
把 .bashrc_docker 文件内容加载到系统变量
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
常用命令介绍
#显示容器的 pid docker-pid 容器名或容器ID #进入容器 docker-enter 容器名或容器ID
4. 导出和导入容器
# 导出容器到本地文件 docker export 容器名或者容器ID > 文件名 #从导出的容器快照文件导入成为镜像 cat 容器快照文件名 | docker import - 仓库名:tag #:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息 (即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
仓库
目前 Docker 官方维护了一个公共仓库 Docker Hub,大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
1. 自动创建镜像
自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。
要配置自动创建,包括如下的步骤:
创建并登录 Docker Hub,以及目标网站;
在目标网站中连接帐户到 Docker Hub;
在 Docker Hub 中 配置一个自动创建;
选取一个目标网站中的项目(需要含 Dockerfile)和分支;
指定 Dockerfile 的位置,并提交创建。
之后,可以 在Docker Hub 的 自动创建页面 中跟踪每次创建的状态。
2. 私有仓库
docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。
#通过 docker 镜像的方式构建私有仓库。 -v 挂载本地卷到容器卷。 --restart=always, 随docker启动而启动. docker run -d -v /var/lib/registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
由于docker push 的时候,默认是 https 连接,实现方法有很多种,这里我们先暂时放行 http 连接。
# 编辑配置文件 vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"], #加速器,aliyun的https://zgmke8qe.mirror.aliyuncs.com "insecure-registries": [ "192.168.8.77:5000"] # 配置 http 连接访问 }
上传镜像到私有仓库
#docker tag 改变镜像仓库名称 docker tag 镜像ID 192.168.8.77:5000/centos #上传镜像到私有仓库 docker push 192.168.8.77:5000/centos #查看仓库里面的镜像 [root@localhost docker]# curl http://192.168.8.77:5000/v2/_catalog {"repositories":["centos","nginx"]}
配置 web 界面查看仓库内的镜像
# 启动 web 界面docker 容器, 传入私有仓库的地址和端口号. docker run -d -e ENV_DOCKER_REGISTRY_HOST=192.168.8.77 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8080:80 konradkleine/docker-registry-frontend:v2 # 访问 web 界面 http://192.168.8.77:8080/home