docker 安装实施
2014-10-28 14:17:00
熊立
  • 访问次数: 10
  • 注册日期: 2014-08-25
  • 最后登录: 2015-09-11
1.apt-get 源更新
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 
$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" 
$ sudo apt-get update 
$ sudo apt-get install lxc-docker

2.docker 开机自启动

$ sudo update-rc.d -f docker.io defaults
重新启动 docker
$ sudo service docker restart

3.查看版本

# docker version
Client version: 1.3.0
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): c78088f
OS/Arch (client): linux/amd64
Server version: 1.3.0
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): c78088f

4.docker安装镜像

ubuntu:

# sudo docker pull ubuntu

5.docker 查看镜像

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              5506de2b643b        4 days ago          199.3 MB

6.docker 启动容器

交互式应用:

# docker run -i -t ubuntu /bin/bash
root@ca4ef558f46e:/# cat /etc/issue
Ubuntu 14.04.1 LTS \n \l
交互方式是为了做好服务器容器而定制的,所有的环境在这里面做
容器的唯一标识符是,这个需要记录
# hostname
ca4ef558f46e

非交互式应用:

# sudo docker run -d -p 10001:22 --name xiongli_app_v1 ubuntu /bin/bash
d394406a56ba651eb8806e04a8c8ccad968c065b05aac5366365514176358669

查看启动的容器,其中 STATUS 是查看容器是否在线

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
ca4ef558f46e        ubuntu:latest       "/bin/bash"         3 minutes ago       Up 3 minutes                                   happy_perlman       
d394406a56ba        ubuntu:latest       "/bin/bash"         8 minutes ago       Exited (0) 8 minutes ago                       xiongli_app_v1

7.定制 openssh 镜像

在之前的 ca4ef558f46e 标识符做定制,并且生成images

# apt-get update 
# apt-get install openssh-server sudo -y
root@ca4ef558f46e:/# sudo /etc/init.d/ssh start
 * Starting OpenBSD Secure Shell server sshd                                                                                                                    [ OK ] 
root@ca4ef558f46e:/# ss -ntl
State       Recv-Q Send-Q                                                   Local Address:Port                                                     Peer Address:Port 
LISTEN      0      128                                                                  *:22                                                                  *:*     
LISTEN      0      128  
可以在主机通过ssh连接下面的这个ip:172.17.0.3 (这个ip只能在本主机连接,其他局域网的电脑无法连接)
root@ca4ef558f46e:/# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
6: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever
需要给ssh新建一个用户,公远程连接,其他业务的根据情况建立
ca4ef558f46e# groupadd admin
ca4ef558f46e# useradd -g admin admin  
ca4ef558f46e# echo 'admin:admin' | chpasswd 
ca4ef558f46e# vi /etc/sudoers
admin   ALL=(ALL)       ALL 

定制 images

退出 ca4ef558f46e
root@ca4ef558f46e:/# exit
exit
查看状态,从容器id和状态 status 可以看出已经退出了,最好是以容器id来查看,这样不会出错
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ca4ef558f46e        ubuntu:latest       "/bin/bash"         30 minutes ago      Exited (0) 18 seconds ago                       happy_perlman  
提交到 ubuntu/ssh (和git命令很像)
# sudo docker commit ca4ef558f46e ubuntu/ssh
a77c510fe2bb786806e6473694662f0440564d9d99b54e57b11f0c8827efa9b5
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/ssh          latest              a77c510fe2bb        5 seconds ago       261.7 MB
ubuntu              latest              5506de2b643b        4 days ago          199.3 MB

8.启动定制的 images

由于这个 ssh 进程启动之后立刻退出了,所以看不到端口映射情况
# sudo docker run -d -p 10001:22 --name xiongli_app_v1.0 ubuntu/ssh /etc/init.d/ssh start
这里提供一个通用的命令,比如把应用用 shell 脚本写在文件 /opt/bootstrap.sh (注意执行权限) 里,启动命令变成
# sudo docker run -d -p 10001:22 --name xiongli_app_v1.0 ubuntu/ssh /opt/bootstrap.sh 

9.迭代开发

基于先前的 ubuntu/ssh 镜像,迭代开发一般是在交互式的方式下进行应用部署,也可以通过ssh远程连接到容器进行开发之后,然后在制定新的images,完成服务和应用的定制,以安装 nginx 为例,当然python应用也可以这样做。

交互方式会新建一个容器id,和之前的 ubuntu 镜像启动一样,这个ssh可以看成是在ubuntu基础上进行的迭代
# sudo docker run -t -i ubuntu/ssh /bin/bash 
这里选择 apt-get 安装,也可以选择源码编译,源码编译安装可以参考这个连接下的一篇文章,和这个类似,http://www.docker.org.cn/thread/13.html 
root@a96987b21552:/# apt-get install nginx
root@a96987b21552:/# /etc/init.d/ssh start
root@a96987b21552:/# /etc/init.d/nginx start
# ss -ntl
State       Recv-Q Send-Q                                                   Local Address:Port                                                     Peer Address:Port 
LISTEN      0      128                                                                  *:80                                                                  *:*     
LISTEN      0      128                                                                  *:22                                                                  *:*     
LISTEN      0      128                                                                 :::80                                                                 :::*     
LISTEN      0      128                                                                 :::22                                                                 :::*     
启动了,可以通过本地ip来访问测试,这里做一个守护脚本,记得ssh用户、nginx启动和文件权限

# vi /opt/bootstrap.sh

#!/bin/bash 
# author: xiongli 
# Email: xionglihdfs@163.com 
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 
export PATH 
echo "welcome to ubuntu/nginx" 
echo "" 
echo "ssh info: " 
echo "the ssh connect username is admin." 
echo "the password of admin is admin." 
echo "the admin has sudo su privileges, so it is super admin." 
echo "" 
echo "nginx web info: " 
echo "the username of cacti web is 'admin'." 
echo "the password of admin is 'admin'." 
echo "the host template of general linux is 'General Linux'." 
echo "" 
echo "" 
echo "the start ssh command is 'docker run -d -p 10002:22 -p10080:80 --name nginx ubuntu/nginx /opt/bootstrap.sh'." 
echo "the start ssh + apache + cacti + nagios command is 'docker run -d -p 10002:22 -p 10080:80 --name nginx ubuntu/nginx /opt/bootstrap.sh'." 
echo "and so on." 
echo "" 
# start ssh 
/etc/init.d/ssh start 
# nginx start 
/etc/init.d/nginx start 
sleep 99999999999999999999999999999999999999999999999999999 
sleep 99999999999999999999999999999999999999999999999999999 
sleep 99999999999999999999999999999999999999999999999999999 
弄好之后,退出并且提交一下images
# exit
# sudo docker commit a96987b21552 ubuntu/nginx
0f054ed6e58e44b43bc45d0770f3c990104d91b9b3c1027b9b169c14838fe96a
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu/nginx        latest              0f054ed6e58e        32 seconds ago      277.4 MB

可以看到迭代的开发镜像了,以分交互方式启动:

# sudo docker run -d -p 10002:22  -p 10080:80 --name nginx ubuntu/nginx /opt/bootstrap.sh
7dad54ebb431a0fff47c1bdb18b6e68fc73c97826d70ccb660699ed98c7a5e90
这些端口选择标准为主机没有被占用的端口即可,冒号前是主机端口,冒号之后是容器程序端口,为了不和其他镜像的端口冲突,请记录这些信息
查看状态
root@uctest:/home/xiongli# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS                         PORTS                                          NAMES
7dad54ebb431        ubuntu/nginx:latest   "/opt/bootstrap.sh"    30 seconds ago      Up 29 seconds                  0.0.0.0:10002->22/tcp, 0.0.0.0:10080->80/tcp   nginx
现在可以通过 ssh 端口 10002 和 web 端口 10080 访问容器的应用了,其他应用类似

测试成功(本机上)

root@uctest:/home/xiongli# curl -v 127.0.0.1:10080
* Rebuilt URL to: 127.0.0.1:10080/
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 10080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:10080
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Tue, 28 Oct 2014 05:33:26 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 04 Mar 2014 11:46:45 GMT
< Connection: keep-alive
< ETag: "5315bd25-264"
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact

10.docker维护命令

docker 维护很简单,分为停止正在运行的容器,启动容器,删除已经停止的容器和删除images镜像

查看正在运行的容器,用容器ID和容器名称状态来确定容器的停止
$ sudo docker ps -a
$ sudo docker stop 容器ID
启动
$ sudo docker start 容器ID
删除停止的 容器ID,这个删除为不可逆操作
$ sudo docker rm 容器ID
删除 images,这个删除为不可逆操作
$ sudo docker rmi IMAGE ID
沙发
2014-10-30 14:47:57
开源春哥
  • 访问次数: 28
  • 注册日期: 2014-06-17
  • 最后登录: 2017-05-17
赞。:)
板凳
2015-11-19 11:49:40
徐笑笑
  • 访问次数: 2
  • 注册日期: 2015-11-19
  • 最后登录: 2015-11-19

在更新源时,执行 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9后,出现

keyserver.ubuntu.com: Host not found
gpgkeys: HTTP fetch error 7: couldn't connect: Connection refused
gpg: 找不到有效的 OpenPGP 数据。
gpg: 合计被处理的数量:0


以上错误信息。不知该怎么解决?


1/1