1, Docker包含三大核心组件--镜像、容器和库。

from Docker开发实践.pdf  http://download.csdn.net/download/xiaochuju526/10124839

镜像:是一个只读的静态模板。它保存着容器需要的环境和应用的执行代码,可以把镜像看成窗口的代码,当代码运行起来后就成了一个容器。镜像采用分层机制,每个镜像都是只读的,但是可以将写数据的层通过联合文件系统附加在原有的镜像之上。这种增量式修改使得镜像非常容易存储、传输和更新。新创建的镜像其实也就是对已有的镜像文件进程增删改操作。

容器:是一个运行时环境,它是一个镜像的运行状态,相对于镜像而言。容器是镜像执行的动态表现。用户可以在容器中运行所想要的程序和服务,而容器就像一个集装箱,它并不关心你运行的到底是什么程序,所有应用的运行方式都一样——创建、开始、停止、重启和销毁;容器也不在乎你在什么样的环境 中运行它,可以在个人电脑、虚拟机 、去服务器、各种操作系统 上运行。容器易于交互、全球传输、易移植、易扩展,非常适合进行软件 开发、软件测试以及软件产品的部署。

库:Docker采用注册服务器来存储和共享用户的镜像,库是某个特定用户存储镜像的目录。通常,一个用可以建立 多个库来保存自己的镜像。从这里可以看出库是注册服务器的一部分,一个个的库组成了一个注册服务器。注册服务器有公共 的和私有的,其中公共的如Docker官方的Docker Hub。注册一个账号,你就可以在里面建立 自己的镜像库。镜像库可以选择开放,也可以选择私有,俟有被允许的组成员才可以访问。

2, Docker的安装

Docker的安装非常容易。目前,Docker支持所有的Linux系统,如Ubuntu\RHEL、Debian等。通过Boot2Docker虚拟工具,在OD X和Windows下也能够运行Docker.

但目前而言,Docker的运行环境也有限制,具体如下。

2-1), 必须是在64位机器上运行,并且目前仅支持x86_64和AMD64,32位系统 暂时不支持。

2-2), 系统的Linux内核必须是3.8或者更新的,内核支持Device Mapper、AUFS、VFS、brtfs等存储格式。

2-3) 内核必须支持cgroups和命名空间。

3, Docker related command and usage

3-1),Docker common command

$docker version

$docker info

$docker help [commandName]

$docker --help

3-2),Container

$docker create [containerName]  (create a container)

$docker run [containerName]  (create and run a container)(docker run = docker create + docker start )

有两种类型容器------后台型容器;交互性容器

--交互型容器

$docker run -i -t --name=inspect_shell ubuntu /bin/bash  (交互型容器)  -i 打开容器的标准输入STDIN; -t为容器建立一个命令行终端。 Ctrl+D 退出容器

--后台型容器

$docker run -p [port in container]:[port in physical system] -d [image] [command] (后台型容器)后台运行并映射端口

$docker run --name daemon_while -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

--Inspect containers commands:

$docker ps   (the running containers)

$docker ps -a   (all containers,including the not-running)

$docker ps -l   (last created container)

$docker ps -n=2  (last created 2 containers)

--Start/stop container:

$docker start  [containerID/containerName]

$docker restart [containerID/containerName]

$docker attach [containerID/containerName] (for 交互性容器, start terminal)

$docker exec -it [containerID/containerName] /bin/bash (for 后台型,start terminal)

http://www.cnblogs.com/520yang/articles/5403548.html

$docker stop [containerID/containerName]

--Delete container:

$docker kill [containerID/containerName]

$docker rm [containerID/containerName]   (can only delete not-running container)   

$docker rm -f [containerID/containerName]   (force delete, can delete running and not-running container)

$sudo docker rm $(sudo docker ps -a -q) (delete all existed containers)

-a means all containers, -q means only list container ID

--Container log:

$docker run -d --name deamon_logs ubuntu /bin/bash -c 'for((i=0;1;i++));do echo $i;sleep 1;done;'

$docker logs -f deamon_logs

$docker logs -f --tail=5 -t deamon_logs  (-t means the log generate time)

--Container process:

$docker top [containerID/containerName]  (inspect container process)

--Inspect container info:

$docker inspect [containerID/containerName] 查看容器里面的配置信息,包含名字,环境变量,运行命令,主机配置,网络配置和数据卷配置, 可以使用-f 或者--format格式化标志,可以指定部分信息

e.g. 查询容器运行状态: $sudo docker inspect --format='{{.State.Running}}' daemon_while

e.g. 查询容器IP地址: $sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' daemon_while

e.g. 查询多个信息: $sudo docker inspect --format='{{.Name}} {{.State.Running}}' daemon_while

--Import/Export container:

$sudo docker run -i -t --name=inspect_import ubuntu /bin/bash

then modify something, install, configure ...

echo '....' >> test.txt

$sudo docker export inspect_import > my_container.tar (导出容器)

$cat my_container.tar | sudo docker import - imported:container  (docker import命令导入本地的tar作为镜像)

$sudo docker images

Besides import local tar file, we can also use a URL to import an online container

$sudo docker import url res:tag

Then can run the image to get our container:

$sudo docker run -i -t --name=inspect_import_new imported:container /bin/bash

3-3),Docker image

Namespace/repository:tag   Namespace:Dockerhub注册的用户名 tag:不写默认是latest

$docker images  列出image

$docker image ubuntu* (支持通配符)

$docker search [query]

$docker tag [imageId] [imageName]   给 image 打 tag

$sudo docker run [image]

$sudo docker pull [image]

$docker push [imageName]  把本地 image 上传到 registry 中 (此时会把所有 tag 都上传上去),命名空间就是dockerhub用户名

$docker login

$docker commit [container] [imageName]  (从 container 创建 image)

$docker build -t [imageName] [pathToFolder]  (从 Dockerfile 创建 image)

--delete image

$sudo docker rmi [image]   (delete image)

$sudo docker rmi -f [image]  如果镜像被某个容器所依赖的话

$sudo docker rm $(sudo docker ps -a -q) 删除所有容器

$sudo docker rmi $(sudo docker images -q)  再删除image


 

4, 创建本地镜像并启动容器的方法有三种

4-1), Import/Export container :

$sudo docker run -i -t --name=inspect_import ubuntu /bin/bash

then modify something, install, configure ...

echo '....' >> test.txt

$sudo docker export inspect_import > my_container.tar (导出容器)

$cat my_container.tar | sudo docker import - imported:container  (docker import命令导入本地的tar作为镜像)

$sudo docker images

Besides import local tar file, we can also use a URL to import an online container

$sudo docker import url res:tag

Then can run the image to get our container:

$sudo docker run -i -t --name=inspect_import_new imported:container /bin/bash

4-2), docker commit

$docker run -i -t ubuntu

$apt-get update

$apt-get install sqlite3

$echo '....' >> test.txt

使用commit命令将容器的修改提交到版本库中,形成一个全新镜像

$sudo docker commit -m="message1" --author='xjguo' [containerID/containerName]  xjguo/sqlite3:v1

xjguo是命名空间,sqlite3是仓库名,v1是tag

$sudo docker images

$sudo docker push xjguo/sqlite3:v1  (push到dockerhub上)0

使用刚才创建的镜像来构建一个容器并运行

$sudo docker run -t -i xjguo/sqlite3:v1

sqlite -version检验 文本test检验

4-3) DockerFile  (recommended)

把对镜像的全部操作写到一个文件中,用docker build从这个文件中创建镜像, 可以透明化,重复利用

DockerFile命令全是大写,后面紧跟着的是参数,具体参考http://blog.csdn.net/i6448038/article/details/50855538

$sudo docker build -t res/test:v1

https://hub.docker.com/

platform team related project (本人公司自用,请忽略这块)

https://github.com/Talend/test-common/tree/master/docker.environment  

createDBDockerService=true

# start db connection

createCommandList=192.168.31.20@docker run -d -e PRODUCT_NAME=DI -e MYSQL_ROOT_PASSWORD=Ce*#0Shi -p 3305:3306 --name mysql-5.7-DI_linux_tis kwang/mysql-5.7:1.0,docker run -d -p 5424:5432 --name postgres-9.4-DI_tis_ubu12 kwang/postgres-9.4:1.0,docker run -d -p 3316:3306 -e MARIA_ROOT_PASSWORD=Ce*#0Shi --name mariadb-10.1-DI_tis_ubu12 lwyu/mariadb-10.1:1.0;192.168.31.174@docker run -d -p 49166:22 -p 49167:1521 -e PRODUCT_NAME=DI --name oracle-xe-11g-DI_tis_ubu12 kwang/oracle-xe-11g:1.0

本地启动一个mysql DB:

$docker pull mysql

$docker run --name xjguo_mysql123 -e MYSQL_ROOT_PASSWORD=root1 -p 3333:3306 -d mysql

5, Docker Hub

--镜像的分发

$sudo docker login

$sudo docker push xjguo/test1:v1

--自动化构建

登录Docker Hub



--创建注册服务器

Docker Hub 是 Docker 官方的公共仓库服务器,用户在 DockerHub 上只能创建一个私有仓库,这对于有些用户是不够用的,而且 DockerHub 服务器的访问速度也是个很大问题,那么我们希望能在自己本地的服务器上创建一个类似于 DockerHub 仓库服务器供团队使用,这也是可以的。http://blog.csdn.net/hazir/article/details/45129387


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐