docker的使用

1查看 docker 程序是否存在,功能是否正常
$ sudo docker info  
Containers: 0  
Images: 0  
Storage Driver: aufs  
 Root Dir: /var/lib/docker/aufs  
 Dirs: 144  
Execution Driver: native-0.1  
Kernel Version: 3.8.0-29-generic  
Registry: [https://index.docker.io/v1/]

在这里我们调用了docker可执行程序的info命令,该命令会返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。

2 运行我们的第一个容器

我们可以使用docker run命令创建容器

$ sudo docker run -i -t ubuntu /bin/bash  
Pulling repository ubuntu from https://index.docker.io/v1  
Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu  
Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c metadata  
Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c fs layer  
Downloading 58337280/? (n/a)  
Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu  
Pulling image 27cf784147099545 () from ubuntu  
root@fcd78e1a3569:/#

$ sudo docker run -i -t ubuntu /bin/bash

首先,我们告诉Docker执行docker run命令,并指定了-i-t两个命令行参数。-i标志保证容器中STDIN是开启的,尽管我们并没有附着到容器中。持久的标准输入是交互式shell的“半边天”,-t标志则是另外“半边天”,它告诉Docker为要创建的容器分配一个伪tty终端。这样,新创建的容器才能提供一个交互式shell。若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数已经是最基本的参数了。

3 使用第一个容器

检查容器的主机名

root@f7cbdac22a02:/# hostname  
f7cbdac22a02

检查容器的/etc/hosts文件

root@f7cbdac22a02:/# cat /etc/hosts  
172.17.0.4  f7cbdac22a02  
127.0.0.1 localhost  
::1 localhost ip6-localhost ip6-loopback  
fe00::0 ip6-localnet  
ff00::0 ip6-mcastprefix  
ff02::1 ip6-allnodes  
ff02::2 ip6-allrouters

检查容器的接口

root@f7cbdac22a02:/#  ip a  
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default  
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
    inet 127.0.0.1/8 scope host lo  
    inet6 ::1/128 scope host  
       valid_lft forever preferred_lft forever  
899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  
    link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff  
    inet 172.17.0.4/16 scope global eth0  
    inet6 fe80::1450:3aff:feb6:f2cc/64 scope link  
       valid_lft forever preferred_lft forever

我们可以看到,这里有lo的环回接口,还有IP为172.17.0.4的标准eth0网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程

检查容器的进程

root@f7cbdac22a02:/#  ps -aux  
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND  
root         1  0.0  0.0  18156  1936 ?        Ss   May30   0:00 /bin/bash  
root        21  0.0  0.0  15568  1100 ?        R+   02:38   0:00 ps -aux

在第一个容器中安装软件包

root@f7cbdac22a02:/# apt-get update && apt-get install vim


4 容器命名

给容器命名

$ sudo docker run --name bob_the_container -i -t ubuntu /bin/bash  
root@aa3f365f0f4e:/# exit

上述命令将会创建一个名为bob_the_container的容器。一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-])。

5 重新启动已经停止的容器

启动已经停止运行的容器

$ sudo docker start bob_the_container

除了容器名称,我们也可以用容器ID来指定容器

6 附着到容器上

附着到正在运行的容器

$ sudo docker attach bob_the_container

7 创建守护式容器

创建长期运行的容器

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

我们在上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。

我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。如果我们执行docker ps命令,可以看到一个正在运行的容器

8容器内部都在干些什么

获取守护式容器的日志

$ sudo docker logs daemon_dave  
hello world  
hello world  
hello world  
hello world  
hello world  
hello world  
hello world  

我们也可以跟踪容器日志的某一片段,和之前类似,只需要在 tail 命令后加入 -f --lines 标志即可。例如,可以用 docker logs --tail 10 daemon_dave 获取日志的最后10行内容。另外,也可以用 docker logs --tail 0 -f daemon_dave 命令来跟踪某个容器的最新日志而不必读取整个日志文件。

9 查看容器内的进程

查看守护式容器的进程

$ sudo docker top daemon_dave

该命令执行后,我们可以看到容器内的所有进程(主要还是我们的while循环)、运行进程的用户及进程ID

docker``top命令的输出结果

PID  USER COMMAND  
977  root /bin/sh -c while true; do echo hello world; sleep 1; done  
1123 root sleep 1

10 在容器内部运行进程

在容器中运行后台任务

$ sudo docker exec -d daemon_dave touch /etc/new_config_file

这里的-d标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在daemon_dave容器内创建了一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。

在容器内运行交互命令

$ sudo docker exec -t -i daemon_dave /bin/bashVersion:

和运行交互容器时一样,这里的-t-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。

11 停止守护式容器

停止正在运行的Docker容器

$ sudo docker stop daemon_dave

12 自动重启容器

自动重启容器

$ sudo docker run --restart=always --name daemon_dave -d ubuntu /  
bin/sh -c "while true; do echo hello world; sleep 1; done"

在本例中,--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure``还接受``一个可选的重启次数参数

on-failure指定count参数

--restart=on-failure:5

这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。

13 深入容器

查看容器

$ sudo docker inspect daemon_dave  
[{  
    "ID": "c2c4e57c12c4c142271c031333823af95d64b20b5d607970c334784430bcbd0f",  
    "Created": "2014-05-10T11:49:01.902029966Z",  
    "Path": "/bin/sh",  
    "Args": [  
        "-c",  
        "while true; do echo hello world; sleep 1; done"  
    ],  
    "Config": {  
        "Hostname": "c2c4e57c12c4",  
. . .

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。

有选择地获取容器信息

$ sudo docker inspect --format='{{ .State.Running }}' daemon_dave  
false

上面这条命令会返回容器的运行状态,示例中该状态为false。我们还能获取其他有用的信息,如容器IP地址

查看容器的IP地址

$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' \  
daemon_dave  
172.17.0.2

查看多个容器

$ sudo docker inspect --format '{{.Name}} {{.State.Running}}' \  
daemon_dave bob_the_container  
/daemon_dave false  
/bob_the_container false

我们可以为该参数指定要查询和返回的查看散列(inspect hash)中的任意部分。

14 删除容器

删除容器

$ sudo docker rm 80430f8d0921  
80430f8d0921

删除所有容器

docker rm `docker ps -a -q`

上面的docker ps命令会列出现有的全部容器,-a标志代表列出所有(all)容器,而-q标志则表示只需要返回容器的ID而不会返回容器的其他信息。这样我们就得到了容器ID的列表,并传给了docker rm命令,从而达到删除所有容器的目的。


15 docker自定义IP网段

 
   
第一步:安装最新版的Docker
备注:操作系统自带的docker的版本太低,不支持静态IP,因此需要自定义安装。
root@localhost:~# apt-get update
root@localhost:~# apt-get install curl
root@localhost:~# curl -fsSLhttps://get.docker.com/ | sh
root@localhost:~# docker -v
Docker version 1.10.3, build 20f81dd


 
   
第二步:创建自定义网络
备注:这里选取了172.18.0.0网段,也可以指定其他任意空闲的网段
docker network create --subnet=172.18.0.0/16 shadownet
注:shadown为自定义网桥的名字,可自己任意取名。

 
    
第三步:在你自定义的网段选取任意IP地址作为你要启动的container的静态IP地址
备注:这里在第二步中创建的网段中选取了172.18.0.10作为静态IP地址。这里以启动shadowsocks为例。
docker run -d -p 2001:2001 --net shadownet --ip 172.18.0.10 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 2001 -k 123456 -m aes-256-cfb

如果需要将指定IP地址的容器出去的请求的源地址改为宿主机上的其他可路由IP地址,可用iptables来实现。比如将静态IP地址172.18.0.10出去的请求的源地址改成公网IP104.232.36.109(前提是本机存在这个IP地址)iptables -t nat -I POSTROUTING -o eth0 -d  0.0.0.0/0 -s 172.18.0.10  -j SNAT --to-source 104.232.36.109

16基础镜像 Commit 生成镜像

除了通过 Dockerfile 来打包生成镜像外,也可以通过 Docker Commit 来生成镜像。通过 Commit 打包的镜像多是由于应用本身在部署时有大量的交互内容,无法通过命令来指定。 在通过 Commit 打包镜像时,我们需要如下操作: 

1.启动一个基础镜像容器,并进入 console docker run -i – t centos:6.7 上面的命令创建了一个基于 CentOS 6.7 的容器,并进入到容器内

2.执行配置环境的命令 登陆容器后,可以执行各种 Linux 下的命令。

等配置完环境后,打开一个新的控制台 执行命令docker ps,可以看到正在运行的容器,比如我的容器的 ID 就是 35f1c2ae1f7e 

 

3.将容器打包成镜像 执行命令 docker commit 35f1c2ae1f7e mynewimage 就将容器35f1c2ae1f7e打包为新的镜像mynewimage

可以执行docker images查看镜像 



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值