一.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.配置镜像加速
首先进入阿里云的容器镜像服务网站点击
然后按照下面操作修改镜像加速
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提供了三种不同的方式将数据从宿主机挂载到容器中:
- volumes:(主机固定目录)
Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。
- bind mounts:(主机任意目录可用)
意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了
- 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