Skip to content
VectorHo edited this page Nov 19, 2014 · 14 revisions

#docker 入门

准备条件

ubuntu 或 centos 等linux

1.1 ubuntu 14.04LTS 安装docker

sudo apt-get update

sudo apt-get install docker.io

这里已经安装好了docker,测试如下

sudo docker.io version

添加软链接,这样可以在命令中用 docker 代替 docker.io

sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

将用户dormi330添加到用户组,这样可以不必每次敲 sudo

sudo groupadd docker

sudo gpasswd -a dormi330 docker

sudo service docker.io restart

注销后登录

docker version

1.2 centos6.5(redhat6.5,centos7看官网简单安装) 安装EPEL、docker ,启动docker

RedHat家族(包括CentOS和Fedora)系列安装Docker需要3.8以上的kernel,另外还需要装Device Mapper,此外,CentOS6和RedHat6还需要安装EPEL。列一个大概的步骤供你参考哈:

####检查内核版本 uname -a
Linux darknight.example.com 3.10.9-200.fc19.x86_64 #1 SMP Wed Aug21 19:27:58 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

####检查device-mapper ls -l /sys/class/misc/device-mapper
lrwxrwxrwx 1 root root 0 Oct 5 18:50 /sys/class/misc/device-mapper -> ../../devices/virtual/misc/device-mapper

####如果没有安装device-mapper,请参考下面的命令: sudo yum install -y device-mapper #安装DeviceMapper
sudo modprobe dm_mod #加载DeviceMapper模块

####CentOS6还需安装EPEL

sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
或 sudo rpm -iUvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

####安装docker

sudo yum install docker-io --enablerepo=epel

sudo docker -d &

完成之后测试

docker version

注:docker 下载后,安装位置为 /var/lib/docker

####Docker在CentoOS6运行一个容器的时候出现下面的错误:可能是selinux权限拦截:cpu... readonly...

$ sudo docker run -i -t centos /bin/bash unable to remount sys readonly: unable to mount sys as readonly max retries reached 碰到这个问题需要修改Docker的配置参数把/etc/sysconfig/docker文件中的other-args更改为:

other_args="--exec-driver=lxc --selinux-enabled" 然后重新启动Docker服务

sudo /etc/init.d/docker restart

2. 安装镜像

https://registry.hub.docker.com/ 上可以看到很多已有的镜像
查看ubuntu相关的镜像

docker search ubuntu:latest

docker search ubuntu:14.04

docker search ubuntu

查看centos相关的镜像

docker search centos:6.5

这里我们选择一个 centos:latest的镜像,下载下来

docker pull centos:latest

查看镜像命令

docker images

使用镜像 交互方式启动一个容器

docker run -ti centos:latest /bin/bash

这是就进入了容器内部,可以认为自己在centos的系统中

bash-4.2# uname -a

退出容器(交互方式启动容器,exit容器就停止)

bash-4.2# exit

守护进程运行、tty方式激活进程

detch: 后台运行,作为宿主机守护进程

attch: 将后台的container tty方式到激活此容器

docker run -d -t -i vector/centos /bin/bash

abxfs09xxx(容器ID)

ps: 如果用的attach得到了docker,但是exit,这样就会使得容器stop,下面的方法将使容器可以自由切换前后台:
docker run -t -i dormi330/centos /bin/bash 输入^P^Q(ctrl+p ctrl+q)退出容器(后台运行) docker attacth xxxxid 再次进入容器,修改后,想退出交互,按快捷键^P^Q即可。

docker ps 查看宿主机当前容器进程

docker ps

查看容器intance logs

docker logs 容器insane

如果想tty方式进入该容器,attch(容器ID)

docker attch abxfs09xxx

3. 常用命令

3.1 情景:使用centos:latest 启动一个容器,然后在容器中,安装 net-tools, 然会退出容器, 保存改动

docker run -ti centos:latest /bin/bash

bash-4.2#

bash-4.2# yum install -f net-tools

bash-4.2# exit

docker ps -l

会出现如下一个表格
CONTAINER ID IMAGE COMMAND 其他字段...
30f62b73248b centos:latest /bin/bash 其他字段值
##### 保存修改 格式 docker commit [CONTAINER ID] [imageId] > docker commit 30f62b73248b centos/v1
这里我们将修改保存到了镜像 centos/v1

docker images

可以看到这个新的镜像,如果用这个centos/v1 镜像,启动一个容器,则容器可以使用netstat命令(该命令属于 net-toos)
3.2 删除不要的镜像 docker rm [镜像的tag或id]

docker images

docker rmi centos/v1

3.3 重命名镜像

docker tag centos:latest centos_basic

docker images

3.4 删除不用的container, 当启动container, 退出并后,如果不再需要这个container,则可以删除

docker ps -a

docker rm 30f62b73248b

3.5 启动一个容器. 已经用过 -t=tty -i=interact 还有其他参数

docker run -t -i centos:latest /bin/bash

3.5 显示所有docker命令

docker

3.6 显示run命令的支持参数

docker run --help

注:个人常用的命令有 run ps tag pull push save load images
3.7 与宿主机器的文件交互

sudo cp [src file] /var/lib/docker/aufs/mnt/[容器完整id]/[容器文件位置]

$sudo cp file.txt /var/lib/docker/aufs/mnt/a9b21b28bc059ff5a2763504e7095ffb5877b8bddeb9caa114d1547d2211ab7b/root/file.txt

4. 外网访问container(默认briage模式)

情景:我在container中启动了一个tomcat,使用默认8080端口,并部署了一个最简单的war,现在我想访问这个web app
首先启动容器

docker run -ti -p 9000:8080 centos/webapp /bin/bash docker port centos/app 8000 可以查看8000映射的宿主机端口,一般结合docker run -P 随机分配一个宿主机端口用

然会访问 宿主机器ip:9000就可以访问 容器中的web应用了 (9000是作为此docker进程转发端口,再开启docker新进程就换掉端口)

如 ie 中 http://172.16.1.43:9000/myapp/

宿主机器的ip 可以通过ipconfig 或 ifconfig查看

host网络模式:共享宿主机器网络(端口)

docker run -t -i --net=host dormi330/centos /bin/bash

--net=host 参数表示 容器使用 宿主机的网络

这在docker + zookeeper集群时尤为重要,不用此参数,会导致zookeeper 无法监听端口。

5. 保存镜像

已经做好的images 可以通过save保存为文件,也可以上传到 https://registry.hub.docker.com/
  • 保存为文件 docker save -o [save/image/to/path] [image name]

    示例 docker images
    docker save -o /home/wzq/docker/centos_v1 centos:latest

    加载保存的镜像

    docker load -i [save/image/to/path]

    示例

    docker load -i /home/wzq/docker/centos_v1

  • 上传到 docker hub上 首先到 https://registry.hub.docker.com/ 上注册,然后 add repository 如 dormi330/centos_v1

    将自己要上传的镜像 重打tag,名字与你的 repository一致,然后push,期间需要登录一次

    docker tag centos:latest dormi330/centos_v1

    docker push dormi330/centos_v1

  • 注意事项:使用save/load 的镜像,如果修改了进行push,貌似会有问题,可以去实验下

    https://github.com/docker/docker/issues/6782

    我个人测试了1.1.2 版本仍然有问题

    所以save/load适合于 不再修改的docker 镜像

    最好的方式是:将做好的镜像push网上,然后也save此镜像,如果修改则从网上pull该镜像,修改 commit push 然后save,覆盖之前save的文件

6 常用命令组合

docker images -tree

docker rm -f $(docker ps -aq) // 删除所有已经停止的容器

docker kill $(docker ps -a -q) // 杀死所有正在运行的容器进程

docker rmi $(docker images -q -f dangling=true) // 删除所有未打 dangling 标签的镜像

docker rmi $(docker images -q) // 删除所有镜像

docker commit $(docker ps -lq) imagexx 提交image镜像xx

# ~/.bash_aliases // 为这些命令创建别名,建立此bash文件

# 杀死所有正在运行的容器. alias dockerkill='docker kill $(docker ps -a -q)'

# 删除所有已经停止的容器. alias dockercleanc='docker rm $(docker ps -a -q)'

# 删除所有未打标签的镜像. alias dockercleani='docker rmi $(docker images -q -f dangling=true)'

# 删除所有已经停止的容器和未打标签的镜像. alias dockerclean='dockercleanc || true && dockercleani'

7 images占满了硬盘,清理冗余image,可采用方法:

1.进入root权限

sudo su

2.停止所有的container,这样才能够删除其中的images:

docker stop $(docker ps -a -q)

如果想要删除所有container的话再加一个指令:

docker rm $(docker ps -a -q)

3.查看当前有些什么images

docker images

4.删除images,通过image的id来指定删除谁

docker rmi

想要删除untagged images,也就是那些id为的image的话可以用

docker rmi -f $(docker images -a| grep “^<none>” | awk “{print $3}”)

要删除全部image的话

docker rmi $(docker images -q)

8.管理docker容器进程

docker top vector0822/centos // 查看此容器内部的进程列表

docker inspect vector/centos // 检查此docker容器的底层信息,json化输出

docker logs -f vector/centos // 这将使docker log命令中使用tail -f来查看容器标准输出

Clone this wiki locally