应用场景
docker使用的时候,有自己一套专业的命令模式,其中有镜像,容器,仓库等等,其中各种命令用法比较容易混淆,这里粗略的整理一下。
1. 镜像:
# docker pull 镜像名 (下载镜像)
# docker run -t -i 镜像名 /bin/bash (利用镜像创建一个容器,在其中运行bash)
# docker images (查看镜像,repository:仓库,TAG:镜像标签,标记同一仓库的不通镜像,ID:镜像唯一ID号)
# docker tag 原仓库名:原版本名TAG ubuntu:latest (为镜像添加新的标签TAG)
# docker inspect 镜像名或镜像ID (获取镜像的详细信息)
# docker search 镜像名 (搜索镜像)
# docker rmi 镜像名 (删除镜像,如果在镜像上层有容器运行,删除失败)
# docker rmi -f 镜像名 (强制删除镜像)
创建镜像有三种方式:
# docker commit -m "add a new file" -a "Docker Newbee" 容器名 新的镜像名 (基于已有镜像的容器创建)
# cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04 (基于本地模板导入)
# docker save -o ubuntu_14.04.tar ubuntu:14.04 (存出本地镜像到本地文件ubuntu:14.04)
# docker load --input ubuntu_14.04.tar (载入镜像)
# docker push user/test:latest (上传本地镜像到仓库 docker tag test:latest user/test:latest)
2. 容器:
启动容器有两种方式:一种是基于镜像新建一个容器并启动,一种是将终止状态的容器重新启动
# docker create -it ubuntu:latest (创建容器,create新建的容器处于禁止状态,docker start 容器名 来启动)
# docker run ubuntu /bin/echo 'Hello World' (输出一个‘Hello World’,之后容器自动终止)
# docker run -t -i ubuntu:14.04 /bin/bash (启动一个bash终端,允许用户进行交互)
# docker run -d ubuntu /bin/sh (使docker容器在后台已守护状态运行)
# docker stop/stop/restart 容器ID
# docker run -idt 镜像名 || docker attach 容器名 (当多个窗口attach到同一个容器的时候,所有窗口会同步显示)
# docker exec -ti 容器ID /bin/bash (进入到刚刚创建的容器中)
# docker rm 容器id或者容器名 (删除终止状态的容器 -f强制)
# docker rm `docker ps -a -q` (删除所有容器的命令)
# docker export 容器id > test_for_run.tar (导出容器到一个tar文件)
# cat test_for_run.tar |docker import - test/ubuntu:v1.0 (导入文件,成为镜像)
注:docker import 和docker load的区别:
使用docker load命令来导入镜像存储文件到本地的镜像库;使用docker import命令来导入一个容器快照到本地镜像库。
3. 仓库:
集中存放镜像的地方,一个容器与之混淆的概念是注册服务器,实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库下面有多个镜像。
# d1.dockerpoll.com/ubuntu d1.dockerpoll.com是注册服务器地址,ubuntu是仓库名
# docker run -d -p 5000:5000 registry (自动下载并启动一个registry容器,创建本地的私有仓库)
# curl 127.0.0.1:5000/v1/search (访问私有仓库中所包含的镜像)
# docker tag daocloud.io/library/mysql:latest 127.0.0.1:5000/test (修改本地镜像的tag)
# docker push 127.0.0.1:5000/test (上传镜像到私有仓库)
# docker pull 192.168.199.31:5000/test (从私有仓库上pull到在使用的客户端)
# tree /opt/data/registry/repositories/ (查看镜像的存储目录和文件 tree /tmp/registry/repositories/ yum -y install tree)
# http://192.168.199.31:5000/v1/search (浏览器访问私有仓库的镜像)
4. 数据管理:
用户杂使用docker的过程中,需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这就涉及到容器的数据管理操作。管理数据的两种方式:数据卷,数据卷容器。
1.在容器内创建数据卷,把本地的目录或文件挂载到容器内的数据卷中
2.使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
5. 数据卷:
# sudo docker run -d -P --name web -v /webapp training/webapp python app.py (使用training/webapp镜像创建web容器,并创建一个数据卷挂载到容器的/webapp目录)
# sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py (挂载主机的/src/webapp目录到容器的/opt/webapp目录做为数据卷)
# sudo docekr run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash (从主机挂载单个文件到容器中做为数据卷)
数据卷容器:(其实就是一个普通的容器,专门提供数据卷供其他容器挂载使用)
# docker run -it -v /dbdata --name dbdata ubuntu (创建一个数据卷容器dbdata,在其中创建一个数据卷挂载到/dbdata)
# docker run -it --volumes-from dbdata --name db1 ubuntu (容器db1和db2都挂载到了同一个数据卷到相同的/databata目录)
# docker run -it --volumes-from dbdata --name db2 ubuntu
6. 网络基础配置:
docker提供了映射容器端口到宿主机和容器关联机制来为容器提供网络服务,使用端口映射机制来将容器内的应用服务提供给外部网络,通过容器互联让多个容器之间进行快捷的网络通信。
容器与外部网络:
# docker run -d -P training/webapp python app.py
容器与容器间:
# docker run -d --name db training/postgres
# docker run -d -P --name web --link db:db training/webapp python app.py
7. 使用dockerfile创建镜像
包含四个部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令
FROM MAINTAINER RUN CMD EXPOSE ENV ADD COPY ENTRYPOINT VOLUME USER WORKDIR ONBUILD
创建镜像:
# docker build -t build_repo/first_image /tmp/docker_builder/ (dockerfile所在路径/tmp/docker_builder,生成的镜像标签为build_repo/first_image)
# docker run -ti -d -v /usr/local/src:/usr/local/src centos /bin/bash
# docker run -d -ti –name tomcat01 docker.io/tomcat
# docker run -ti docker.io/nginx /bin/bash
# docker build -t="xubin/jweb" .
docker build -t xubin/jweb .
1,创建项目:https://github.com/changedi/mydocker
2,编辑 Dockerfile:https://github.com/changedi/mydocker/blob/master/Dockerfile
3,在本地项目中运行 docker build <image_name> .,build一个自定义名字的镜像
4,启动这个镜像容器:docker run -d -p 80:80 <image_name>
这样,这个镜像就好了,服务也起来了,后续可以通过docker ps来查看启动的镜像,通过docker stop来停止容器。
# docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash
# tar -zxf /mnt/software/jdk-7u67-linux-x64.tar.gz -C .
# mv jdk1.7.0_67/ jdk/
# tar -zxf /mnt/software/apache-tomcat-7.0.55.tar.gz -C .
# mv apache-tomcat-7.0.55/ tomcat/
首先,编辑.bashrc文件
# vi ~/.bashrc
然后,在该文件末尾添加如下配置:
# export JAVA_HOME=/opt/jdk export PATH=$PATH:$JAVA_HOME
最后,需要使用source命令,让环境变量生效:
# source ~/.bashrc
编写运行脚本
我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下:
首先,创建运行脚本:
# vi /root/run.sh
然后,编辑脚本内容如下:
# !/bin/bash source ~/.bashrc sh /opt/tomcat/bin/catalina.sh run
注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。
最后,为运行脚本添加执行权限:
# chmod u+x /root/run.sh
退出容器
当以上步骤全部完成后,可使用exit命令,退出容器。
随后,可使用如下命令查看正在运行的容器:
# docker ps
使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:
# docker commit 57c312bbaad1 huangyong/javaweb:0.1
# docker run -d -p 58080:8080 --name javaweb huangyong/javaweb:0.1 /root/run.sh