一.Docker安装

 

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS-7 上,要求系统为64位、系统内核版本为 3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

所以我们需要查看自己的Centos内核是否支持Docker,使用下面的命令,可根据上面对照看自己的Centos是否符合要求,如不符合请升级。

#查看系统内核


[ironmanjay@localhost ~]$ uname -a


1.更新下载源

先备份


sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup


更换源


sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo


2.更新yum


sudo yum update


3.安装相关软件包


sudo yum -y install gcc

sudo yum -y install gcc-c++

sudo yum install -y yum-utils device-mapper-persistent-data lvm2


4.更新yum软件包索引


sudo yum makecache fast


5.安装Dcoker


sudo yum -y install docker-ce


6.启动Dcoker服务


systemctl start docker


7.设置开机自启


sudo systemctl enable docker


8.Docker加入到组中


sudo groupadd docker

sudo gpasswd -a [本地用户名] docker


9.配置镜像加速

首先进入阿里云的容器镜像服务网站点击

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Frepositories&lang=en,使用支付宝淘宝登录都可以,如下图,复制加速器地址。

docker 安装多个内核版本的 docker 不同内核_docker

    然后按照下面操作修改镜像加速


sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json


    在打开的文件中按照下面编辑

{
  "registry-mirrors": ["刚刚复制的加速器地址"]
}
 
    加载配置文件
 
sudo systemctl daemon-reload
 
    重启Docker服务
 
sudo systemctl restart docker

10.测试

1.查看版本

docker version

2. HelloWorld

docker pull hello-world

docker run hello-world

至此安装完毕!

二.Docker常用命令

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。


如:docker stats --help


1. 帮助命令


docker version                                 #查看版本号

docker info                                             #显示Docker系统信息,包括镜像和容器数

docker --help                                  #查看Docker有哪些命令


2.镜像命令


docker images                                  #查看当前Docker中的镜像

docker images ls                                       #列出所有的镜像

docker search 某个镜像名字                        #查询某个镜像

docker pull 某个镜像名字                         #拉取(下载)某个镜像

docker rmi 某个镜像名字ID                               #删除某个镜像


3.容器基本命令(切记,有镜像才能创建容器)


docker run [OPTIONS] image [COMMAND] [ARG...]          #新建并启动容器
例子:docker run -it ubuntu /bin/bash       
        -i: 交互式操作。
        -t: 终端。
        ubuntu: ubuntu 镜像。
        /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker ps [OPTIONS]                                   #列出当前所有正在运行的容器
                                              –a 全部  -l 最近一个
exit                                          #容器停止退出
ctrl+P+Q                                              #容器不停止退出
docker start 容器ID或者容器名/或前四位容器ID      #启动容器
docker restart 容器ID或者容器名                 #重启容器
docker stop 容器ID或者容器名                    #停止容器
docker kill 容器ID或者容器名                    #强制停止容器
docker rm 容器ID                                      #删除已停止的容器
docker rm -f $(docker ps -a -q)                #一次性删除多个容器
docker ps -a -q | xargs docker rm                       #一次性删除多个容器
docker container prune                                #可以清理掉所有处于终止状态的容器。


5.容器重要命令


docker run -d 容器名                            #启动守护式容器,就是后台运行

如:docker run -itd --name ubuntu-test ubuntu /bin/bash        #--name 给容器起个名字

docker logs -f -t --tail 容器ID                #查看容器日志,-t是加入时间戳,-f是最新的日志打印,--tail数字显示最后多少条

docker top 容器ID                              #查看容器内运行的进程

docker inspect 容器ID                          #查看容器内部细节

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

进入容器的方法

docker exec -it 容器ID /bin/bash                       #进入正在运行的容器并以命令行交互,使用exit退出后容器存活

docker exec -it  -u root容器ID /bin/bash          #以root用户登录容器

docker attach 容器ID                           #重新进入Docker容器,使用exit退出后容器停止

docker cp  容器ID:容器内路径 目的主机路径          #从容器内拷贝文件到主机上

docker cp 容器名:要拷贝的文件在容器里面的路径        要拷贝到宿主机的相应路径 

docker cp 要拷贝的文件路径    容器名:要拷贝到容器里面对应的路径

导入,导入容器

docker export 容器ID  > 文件名

例子:docker export 1e560fca3906 > tomcat.tar    #导出容器 1e560fca3906 快照到本地文件 tomcat.tar 

Docker import

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 tomcat.tar 导入到镜像 test/tomcat:v1:

cat tomcat.tar | docker import - test/tomcat:v1

通过docker images 查看,后启动看一下

docker run -it --name tomcatv1 test/tomcat:v1 /bin/bash

通过export 和import备份恢复的容器 ,在原容器内存储的文件会保存在新建容器中

通过指定 URL 或者某个目录来导入,例如:

$ docker import http://example.com/exampleimage.tgz example/imagerepo

docker port  容器ID/容器名                     #查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号


运行一个 web 应用

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。


runoob@runoob:~# docker pull training/webapp  # 载入镜像

runoob@runoob:~# docker run -d -P training/webapp python app.py

-d:让容器在后台运行。

-P:将容器内部使用的网络端口随机映射到我们使用的主机上。


32768端口就是python app.py打开的应用


[root@node1 ~]# netstat -anp | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::32768                :::*                    LISTEN      25914/docker-proxy
这里多了端口信息。
PORTS
0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。


查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器:


runoob@runoob:~#  docker ps
CONTAINER ID        IMAGE               COMMAND             ...        PORTS                 
d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp


测试

Linux系统shell测试方法:

curl http://0.0.0.0:32768

我们也可以通过 -p 参数来设置不一样的端口:


docker run -d -p 5001:5000 training/webapp python app.py
 
 
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
9050a369d711        training/webapp     "python app.py"     6 seconds ago       Up 5 seconds        0.0.0.0:5001->5000/tcp    sharp_benz


容器内部的 5000 端口映射到我们本地主机的 5001 端口上。

三.创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

1、从已经创建的容器中更新镜像,并且提交这个镜像

2、使用 Dockerfile 指令来创建一个新的镜像

方法1:从容器中更新镜像

例子:

1.创建一个容器:docker run -t -i ubuntu:15.10 /bin/bash

root@e218edb10161:/#

2.在容器内安装软件,进行修改等操作

更新源参见附件1”容器apt-get=yum(linux)”软件换源

apt-get update

apt-get install vim

apt-get  install net-tools

。。。。。编辑后

3. 通过容器创建镜像

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

各个参数说明:

-m: 提交的描述信息

-a: 指定镜像作者

e218edb10161容器 ID

runoob/ubuntu:v2: 指定要创建的目标镜像名

4.查看

 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2

方法2:构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像


runoob@runoob:~$ cat Dockerfile
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"
RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D


每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。


runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob


参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec


runoob@runoob:~$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE


我们可以使用新的镜像来创建容器


runoob@runoob:~$ docker run -t -i runoob/centos:6.7  /bin/bash
[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)


四.数据卷

Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

  1. volumes:(主机固定目录)

Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

  1. bind mounts:(主机任意目录可用)

意为着可以存储在宿主机系统的任意位置;(比较常用的方式

但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了

  1. tmpfs:(内存中挂载)

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式

 

4.1 volume的基本使用

1管理卷


# docker volume create edc-nginx-vol // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息


查看:


Cd /var/lib/docker/volumes
[root@node1 volumes]# ls
db2volume1  metadata.db


 2 卷的管理

docker run -it --name=liuyang-db2 -p 50001:50000 -v db2volume1:/store centos/db2:v10 /bin/bash

-v代表挂载数据卷  这里使用自定数据卷db2volume1并且将数据卷挂载到 容器内的/store目录

测试:

我们在容器内/store下创建目录backup和文件1.txt

我们在主机上/var/lib/docker/volumes/db2volume1/_data中看到创建的文件及目录。

如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉

我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

3清理卷

  如果不再使用自定义数据卷了,那么可以手动清理掉:

# docker stop liuyang-db2 // 暂停容器实例  liuyang-db2为容器名
# docker rm liuyang-db2 // 移除容器实例
# docker volume rm db2volume1 // 删除自定义数据卷

4.2 bin mounts的基本使用

[root@node1 /]# docker images
REPOSITORY         TAG                 IMAGE ID            CREATED             SIZE
centos/db2          v10                 e1c7bfb0367e        56 minutes ago      5.1GB

docker run -it -u root --name=liuyang-db2-v2 -v /home/containerv2/:/store centos/db2:v10

将宿主机上的/home/containerv2/目录(如果没有会自动创建)挂载到容器的 /store目录上

例子:
容器)
[db2inst1@7c5d4dfc0d43 /]$ cd /store
[db2inst1@7c5d4dfc0d43 store]$ ls
[db2inst1@7c5d4dfc0d43 store]$ mkdir v2
[db2inst1@7c5d4dfc0d43 store]$

主)

[root@node1 home]# cd /home/containerv2/
[root@node1 containerv2]# ls
v2
[root@node1 containerv2]# touch 2.txt

容器)

[db2inst1@7c5d4dfc0d43 store]$ ls
2.txt  v2
[db2inst1@7c5d4dfc0d43 store]$

验证:

docker inspect liuyang-db2-v2  # liuyang-db2-v2容器名字

"Mounts": [
{
"Type": "bind",
"Source": "/home/containerv2",
"Destination": "/store",
"Mode": "",
"RW": true,
"Propagation": "rprivate"

清理

docker stop  liuyang-db2-v2  停止容器
docker rm liuyang-db2-v2   删除容器

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:

docker exec consul-server consul reload

五.网络

1.bridge网络模式主机网卡与容器网卡对应关系。可以通过iflink 找到对应关系。

在宿主机上执行命令ip link

$ ip link
......
13: veth56ecf40@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue mast
er docker0 state UP mode DEFAULT group default
    link/ether 56:17:10:68:88:b1 brd ff:ff:ff:ff:ff:ff link-netnsid 4
15: veth0f80cbf@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue mast
er docker0 state UP mode DEFAULT group default
    link/ether fa:e6:8f:3b:01:54 brd ff:ff:ff:ff:ff:ff link-netnsid 5

在容器内查看iflink文件

root@336043b07211:/# docker exec -it nginx-1 bash
root@336043b07211:/# cat /sys/class/net/eth0/iflink
13
root@336043b07211:/# docker exec -it nginx-2 bash
root@336043b07211:/# cat /sys/class/net/eth0/iflink
15

这样就可以确定:
nginx-1这个容器在物理机上对应的veth pair是veth56ecf40@if12;
nginx-2这个容器在物理机上对应的veth pair是veth0f80cbf@if14。

附件一

更新源


apt-get update

apt-get install net-tools  安装ifconfig工具

apt-get install vim  安装vi编辑工具


1.如果源不好用可以更新163源:


原文件备份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

修改源(直接修改,未使用vi或者vim修改)

echo "">sources.list
echo "deb http://mirrors.163.com/ubuntu/ artful main restricted universe multiverse">>sources.list
echo "deb http://mirrors.163.com/ubuntu/ artful-security main restricted universe multiverse">>sources.list
echo "deb http://mirrors.163.com/ubuntu/ artful-updates main restricted universe multiverse">>sources.list
echo "deb http://mirrors.163.com/ubuntu/ artful-proposed main restricted universe multiverse">>sources.list
echo "deb http://mirrors.163.com/ubuntu/ artful-backports main restricted universe multiverse">>sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ artful main restricted universe multiverse">>sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ artful-security main restricted universe multiverse">>sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ artful-updates main restricted universe multiverse">>sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ artful-proposed main restricted universe multiverse">>sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ artful-backports main restricted universe multiverse">>sources.list


2. 如果源不好用可以更新阿里源:


1、原文件备份

sudo mv /etc/apt/sources.list  /etc/apt/source.list.bak

2、编辑源列表文件

sudo vim /etc/apt/sources.list

3、用下面的文本作为内容,

ubuntu 14的版本的如下

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multivers

ubuntu 16的版本

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
#测试版源
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
#源码
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
#测试版源
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
#Canonical 合作伙伴和附加
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main


3.如果源不好用可以更新中科大镜像源:


sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
编辑源列表文件
sudo vim /etc/apt/sources.list
将原来的列表删除,添加如下内容(中科大镜像源)
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse