docker的基本操作
1、基本信息查看
docker version:查看docker的版本号,包括客户端、服务端、依赖的Go等
docker info
:查看系统(docker)层面信息,包括管理的images, containers数等
2、镜像的获取与容器的使用
镜像可以看作是包含有某些软件的容器系统,比如ubuntu就是一个官方的基础镜像,很多镜像都是基于这个镜像“衍生”,该镜像包含基本的ubuntu系统。再比如,hipache是一个官方的镜像容器,运行后可以支持http和websocket的代理服务,而这个镜像本身又基于ubuntu。
搜索镜像
docker search <image_name>:在docker index中搜索image
下载镜像
docker pull <image> :从docker registry server
中下拉image
查看镜像
docker images: 列出images
docker images -a :列出所有的images(包含历史)
删除镜像
docker rmi <image ID>: 删除一个或多个image
在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器
使用镜像创建容器
[root@localhost /]# docker run chug/ubuntu12.10x64 /bin/echo hello world
hello world
交互式运行
[root@localhost /]# docker run -i -t chug/ubuntu12.10x64 /bin/bash
root@2161509ff65e:/#
查看容器
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
再次启动容器
docker start/stop/restart
<container> :开启/停止/重启container
docker start [container_id] :再次运行某个container
(包括历史container)
docker attach [container_id]
:连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach
一个container实例)
docker start -i <container>
:启动一个container并进入交互模式(相当于先start,在attach)
docker run -i -t <image> /bin/bash
:使用image创建container并进入交互模式, login shell是/bin/bash
docker run -i -t -p <host_port:contain_port>
:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port
映射到一个动态端口。
注:使用start是启动已经创建过得container,使用run则通过image开启一个新的container。
docker run 启动容器
案例docker run --name some-nginx -p 80:80 -v /some/content:/usr/share/nginx/html -d nginx
--name:给容器指定一个名字
-d:使容器在后台执行
-v:绑定挂载点,将宿主机目录挂载到container中的目录上,这样在容器内的环境就可以访问宿主主机内的内容.前面是主机目录,后面是容器目录
-p:端口映射,将宿主主机端口映射到container中的端口
删除容器
docker rm <container...>
:删除一个或多个container
docker rm `docker ps -a -q` :删除所有的container
docker ps -a -q | xargs docker rm :同上,
删除所有的container
3、持久化容器与镜像
3.1 通过容器生成新的镜像
运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit <container-id> <image-name>命令可以把一个正在运行的容器变成一个新的镜像。
docker commit <container> [repo:tag] 将一个container固化为一个新的image,后面的repo:tag可选。
3.2 持久化容器
export命令用于持久化容器
docker export <CONTAINER ID> > /tmp/export.tar
3.3 持久化镜像
Save命令用于持久化镜像
docker save 镜像ID > /tmp/save.tar
3.4 导入持久化container
导入export.tar文件
[root@localhost /]# cat /tmp/export.tar | docker import - export:latest
af19a55ff0745fb0a68655392d6d7653c29460d22d916814208bbb9626183aaa
3.5 导入持久化image
导入save.tar文件
[root@localhost /]# docker load < /tmp/save.tar
对image打tag
[root@localhost /]# docker tag daa11948e23d load:tag
3.7 一些其它命令
docker logs $CONTAINER_ID
#查看docker实例运行日志,确保正常运行
docker inspect $CONTAINER_ID #docker inspect
<image|container> 查看image或container的底层信息
docker build <path>
寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的image
docker build -t repo[:tag] 同上,可以指定repo和可选的tag
docker build - < <dockerfile>
使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的image
docker port <container> <container port>
查看本地哪个端口映射到container的指定端口,其实用docker ps 也可以看到
4、 一些使用技巧
4.1 docker文件存放目录
Docker实际上把所有东西都放到/var/lib/docker路径下了。
containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file
system
layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。
4.2 查看root密码
docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码了。
docker logs 5817938c3f6e 2>&1 | grep 'User: ' | tail -n1
5、存储
在Docker容器运行期间,对文件系统的所有修改都会以增量的方式反映在容器使用的联合文件系统中,并不是真正的对只读层数据信息修改。每次运行容器对它的修改,都可以理解成对夹心饼干又添加了一层奶油。这层奶油仅供当前容器使用。当删除Docker容器,或通过该镜像重新启动时,之前的更改将会丢失。这样做并不便于我们持久化和共享数据。Docker的数据卷这个东西可以帮到我们。
在创建容器时,通过-v参数可以指定将容器内的某个目录作为数据卷加载:
docker run -i -t -v /home/www ubuntu:latest sh -c '/bin/bash' 在容器中会多一个/home/www挂载点,在这个挂载点存储数据会绕过联合文件系统。我们可以通过下面的命令来找到这个数据卷在主机上真正的存储位置:docker inspect -f {{.Volumes}} container_id 你会看到输出了一个指向到/var/lib/docker/vfs/dir/...的目录。cd进入后你会发现在容器中对/home/www的读写创建,都会反映到这儿。事实上,/home/www就是挂载自这个位置。
有时候,我们需要将本地的文件目录挂载到容器内的位置,同样是使用数据卷这一个特性,-v参数格式为:
docker run -it -v [host_dir]:[container_dir]
host_dir是主机的目录,container_dir是容器的目录.
容器和容器之间是可以共享数据卷的,我们可以单独创建一些容器,存放如数据库持久化存储、配置文件一类的东西,然而这些容器并不需要运行。
docker run --name dbdata ubuntu echo "Data Container."在需要使用这个数据容器的容器创建时–volumes-from [容器名]的方式来使用这个数据共享容器。
$sudo docker inspect -f {{.Volumes}} ecstatic_lumiere
map[/shen/shen/123:/var/lib/docker/volumes/be9e74b1605134b31fbad47f86943dbf07ddeae21476765b417ce3db7b5300c9/_data /var/jenkins_home:/var/lib/docker/volumes/8a96c2ee07042755d665d6ef3c968abfe83a352986163760158bb6fb1f09def4/_data]
数据都是挂载在宿主机上的