Ubuntu 16.04安装Docker

来源:互联网 发布:求50个的素数编程 编辑:程序博客网 时间:2024/06/05 23:00

1.Docker在Ubuntu16.04上安装

1.1.先决条件1,添加Docker源

linuxidc@linuxidc.com:~$ sudo apt-get update

增加CA证书

linuxidc@linuxidc.com:~$ sudo apt-get install apt-transport-https ca-certificates

添加GPG Key(一种加密手段)

linuxidc@linuxidc.com:~$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

创建docker.list文件

linuxidc@linuxidc.com:~$ sudo vim /etc/apt/sources.list.d/docker.list#添加Ubuntu16.04LST的入口deb https://apt.dockerproject.org/repo ubuntu-xenial main

再次更新源

linuxidc@linuxidc.com:~$ sudo apt-get update

以防万一,清除过时的源

linuxidc@linuxidc.com:~$ sudo apt-get purge lxc-docker

验证下APT是从正确的库源下载应用的

linuxidc@linuxidc.com:~$ apt-cache policy docker-engine

这里写图片描述
至此,可见已经配置好了Docker的源

1.2.先决条件2,安装aufs驱动linux-image-extra

For Ubuntu Trusty, Wily, and Xenial, it’s recommended to install the linux-image-extra kernel package. The linux-image-extra package allows you use the aufs storage driver可以实现容器间可执行文件和运行库的共享。

更新源,会发现Hit:9 https://apt.dockerproject.org/repo ubuntu-xenial InRelease,也说明Docker在第一步1设置成功。

linuxidc@linuxidc.com:~$ sudo apt-get update

安装 linux-image-extra

linuxidc@linuxidc.com:~$ sudo apt-get install linux-image-extra-$(uname -r)

这里写图片描述

1.3.安装Docker(如果先决条件1,2步正确完成了)

更新源

linuxidc@linuxidc.com:~$ sudo apt-get update

通过apt命令在线安装docker

linuxidc@linuxidc.com:~$ sudo apt-get install docker-engine

开启docker的守护进程(Docker服务开启)

linuxidc@linuxidc.com:~$ sudo service docker start

1.3.1.操作

国际惯例,用一个Hello world的来测试安装成功

linuxidc@linuxidc.com:~$ sudo docker run hello-world

本地本来没有Hello World镜像,通过Docker源获取到,并成功现实Hello world。 
这里写图片描述
查看正在运行的容器

sudo docker ps -ls

这里写图片描述


1.3.2.新增容器

安装好之后,我们就可以来开始Docker之旅了,

  我们现在的Docker还是一个”裸”Docker,上面没有容器,等一下,什么是容器?所谓容器就是Docker中用来运行应用的,Docker的容器很轻量级,但功能却强悍的很。也没有镜像。镜像?镜像简单理解就是容器的只读版本,用来方便存储与交流。此时,我们可以通过官方提供给我们的镜像来进行学习。比如我们想在Docker中运行一个Ubuntu系统,很简单,Docker中得pull命令是用来获取镜像的,执行下面的命令,就会从官方仓库里获取Ubuntu 14.04版本的系统:

docker pull ubuntu:14.04

  images命令用来查看本机Docker中存在哪些镜像,运行 docker images 就会看到我们刚才获取的Ubuntu14.04系统:

  现在,我们把刚刚的镜像运行起来,运行起来的镜像就叫做容器了,容器是可读写的,这样我们就可以在容器里做很多有意思的事情了。run 命令就是将镜像运行起来的,运行:

docker run -it ubuntu:14.04

  仔细看,你会发现终端交互的用户名变掉了,说明我们进入到了容器的内部,效果如下:

  现在我们所做的任何操作都是针对于目前容器而言的,不会影响到原来的系统,例如,我们在里面安装下nginx服务器,运行如下命令:

sudo apt-get install -y nginx

  完成后执行nginx -v就会发现我们已经将nginx安装成功:


1.3.2.1将容器转化为镜像


  在上一小节中,我们已经在容器里安装好了nginx,接下来我们希望将这个容器内容保存下来,这样我们下次就无需再次安装了。这就是Docker中将容器转换为镜像的技术。

  如果您还在刚刚的安装了nginx的终端里,执行exit退出此终端,回到系统本身的终端:

  ps命令可以查看我们当前都运行了哪些容器,加上-a参数后就表示运行过哪些容器,因为我们刚刚已经退出了安装nginx的容器,因此我现在想查看它的话,需要使用-a参数,执行如下命令:

docker ps -a

  此时,就会显示出我们刚刚运行的容器,并且Docker会很贴心的随机给每个容器都起个Names方便标示。效果如下:

  commit命令用来将容器转化为镜像,运行下面的命令,我们可以讲刚刚的容器转换为镜像:

sudo docker commit -m "Added nginx from ubuntu14.04" -a "saymagic" 79c761f627f3 saymagic/ubuntu-nginx:v1

  其中,-m参数用来来指定提交的说明信息;-a可以指定用户信息的;79c761f627f3代表的是容器的id;saymagic/ubuntu-nginx:v1指定目标镜像的用户名、仓库名和tag 信息。创建成功后会返回这个镜像的ID信息。注意的是,你一定要将saymagic改为你自己的用户名。因为下文还会用到此用户名。

  这是我们再次使用docker images命令就会发现此时多出了一个我们刚刚创建的镜像:

  此时,如果运行 docker run -it saymagic/ubuntu-nginx:v1 就会是一个已经安装了nginx的容器:


1.3.2.2.存储镜像


  我们刚刚已经创建了自己的第一个镜像,尽管它很简单,但这已经非常棒了,现在,我们希望它能够被更多的人使用到,此时,我们就需要将这个镜像上传到镜像仓库,Docker的官方Docker Hub应该是目前最大的Docker镜像中心,所以,我们就将我们的镜像上传到Docker Hub。

  首先,我们需要成为Docker Hub的用户,前往 https://hub.docker.com/ 进行注册。需要注意的是,为了方便下面的操作,你需要将你的用户名设为和我刚刚在上文提到的自定义用户名相同,例如我的刚刚将镜像的名字命名为是saymagic/ubuntu-nginx:v2,所以我的用户名为saymagic、注册完成后记住用户名、密码、邮箱。

  login默认是用来登陆Docker Hub的,因此,输入如下命令来尝试登陆Docker Hub:

docker login

  此时,就会输出交互,让我们输入Username、Password、Email,成功输入我们刚才注册的信息后就会返回Login Success提示:

  运行命令:

docker push saymagic/ubuntu-nginx:v1

  这就是我们为什么将刚刚的镜像命名为saymagic/ubuntu-nginx:v1的原因,如果你上面步骤都操作正确的正确的话,是会得到下面的内容:

  此时,不出意外的话,我们的镜像已经被上传到Docker Hub上面了,去Docker Hub上面看看:

  果然,我们在Docker Hub上有了我们的第一个镜像,此时,其它的用户就可以通过命令docker pull saymagic/ubuntu-nginx来直接获取一个安装了nginx的ubuntu系统了。不信?那就自己实践一下吧!


2.Dockerfile使用


  通过上面的学习,我们掌握了如何创建镜像、获取镜像、上传镜像、运行容器等等内容。有了上面的知识,我们来次实战。

  我们刚刚使用了commit命令创建了一个安装nginx的镜像,但其实Docker创建镜像的命令还有build,build命令可以通过指定一个Dockerfile文件来实现将镜像创建过程自动化。Dockerfile文件有着特定的编写规则,但语法都还比较容易理解。这次我们不仅使用Dockerfile文件来创建一个像上文一样安装nginx的ubuntu镜像,还要发挥nginx的老本行来运行一个网页吧!DockFile可以很轻松的完成这个问题。首先将新建一个名字为www的文件夹,文件夹下面可以放一些HTML网页,比如新建一个index.html文件,随便写点内容:

<html><head>Learn Docker</head><body><h1>Enjoy Docker!</h1></body></html>

www的同级目录下新建一个名为Dockerfile的文件,将DockerFile文件改写如下:

FROM ubuntu:14.04MAINTAINER saymagic saymagic@163.comRUN apt-get updateRUN apt-get install -y nginxCOPY ./www /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

  我来整体的解释下这个Dockerfile文件,第一行是用来声明我们的镜像是基于什么构建的,这里我们指定为ubuntu 14.04,第二行的作用在于告诉别人你的大名。第三行和第四行的RUN命令用来在容器内部的shell里执行命令。第五行将当前系统的www文件夹拷贝到容器的/usr/share/nginx/html目录下,第六行声明当前需要对外开放80端口,最后一行表示运行容器时开启nginx。不理解没关系,因为这都是固定的语法,感兴趣可以多看相关内容。此时我们通过build命令来构建镜像,运行:

docker build -t="saymagic/ubuntu-nginx:v2" .

  注意,最后的.表示Dockerfile在当前目录,也可指定其它目录。此时,再次运行docker images就会看到刚刚生成的镜像:

  现在我们就可以运行刚刚的镜像了,和前面运行稍有不同,此时我们需要对外指定80端口,该行为通过-p参数指定,运行:

docker run -p 80:80 saymagic/ubuntu-nginx:v2

  此时,终端会卡住,这是正常的,因为Docker的思想是每个容器最好只开一个线程做一件事,此时我们打开了nginx服务器,所以终端卡住也没关系(当然是有办法来解决这个问题,但这里不做介绍)。现在我们可以通过浏览器访问localhost查看效果,如果是虚拟主机则需输入主机ip地址,然后就能看到了如下的页面:

3.DaoCloud实战

  如果我们自己没有服务器,刚刚的网页我们只能在本地访问,好可惜。别急,现在我要隆重介绍一个Docker的好伙伴——DaoCloud,官网传送门:https://www.daocloud.io/

  有了DaoCloud,我们只需要负责写Dockerfile,剩下的build、运行之类的东西都交给DaoCloud,我们只需要点一点按钮即可。

  DaoCloud会将Github、GitCafe等git服务商作为代码源,这里我使用GitCafe,为了你下面的操作更加方便,你可以直接Fork我的项目,项目地址: https://gitcafe.com/saymagic/LearnDocker 。

  接着,我们需要去Daocloud注册一个账号,完成后,进入个人主页后选择代码构建->创建新项目->给项目起一个响亮的名字->同步GitCafe代码源->选择GitCafe下的LearnDocker项目:

  最后,点击开始创建按钮。Daoloud就会马不停蹄的运行起来。如果细心的话你会发现,DaoCloud的build会比本地快很多,很迅速就会完成镜像的构建:

  仅仅是构建镜像没什么意思, DaoCloud还可以将这个镜像在云端运行起来。我们点击绿色的查看镜像按钮,跳转到如下页面:

  在DaoCloud中镜像需要运行在容器中,因为当前我们只构建了一个版本,所以选择部署最新版本和下面的部署按钮效果相同,点击任意一个,来到了这里:

  我们给容器起一个霸气的名字learndocker,然后点击页面最下面的立即部署按钮,秒秒钟,我们的应用就运行了起来:

  此时,注意到你自己运行成功的url后面的链接,将其复制到浏览器打开,你会发现,网页的内容就是本篇博客:

 

4.创建Docker用户组,避免使用sudo

如第一步最后“查看正在运行的容器”如果没有sudo,不以root身份权限运行查看容器命令则会报错Cannot connect to the Docker daemon. Is the docker daemon running on this host?如图 
这里写图片描述

原因: 
The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can access it with sudo. For this reason, docker daemon always runs as the root user.

To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.

创建用户组docker,可以避免使用sudo 
将docker和linuxidc(王小雷用户名,在创建主机时默认用户名称是ubuntu)添加到一个组内

#默认是ubuntu用户#linuxidc@linuxidc.com:~$ sudo usermod -aG docker ubuntu# 将linuxidc的用户添加到docker用户组中,如果多个用户需要用空格隔开 如 linuxidc wxl1 wxl2用户linuxidc@linuxidc.com:~$ sudo usermod -aG docker linuxidc

注意需要重新启动计算机或者注销用户再登入,才能生效。这样就不需要使用sudo命令了。 
那么,如何将linuxidc从docker用户组移除? 
sudo gpasswd -d linuxidc docker 
如何删除刚才创建的docker用户组? 
sudo groupdel docker 
如何创建和删除新用户,如用户newuser 
sudo adduser newuser 
sudo userdel newuser

5.如何更新Docker

linuxidc@linuxidc.com:~$ sudo apt-get upgrade docker-engine

6.如何卸载Docker

linuxidc@linuxidc.com:~$ sudo apt-get purge docker-engine

 写在最后
  Docker能做的事情远不止这些,更多有意思的事情还请读者慢慢用心去发现。