DOCKER的安装与学习
环境信息
centos7.2
学习目录
DOCKER安装
docker设置固定ip地址
docker动态设置端口映射
DOCKER安装
1. 安装前工作
检查内核版本(uname -r),docker要求需要大于3.10才可以
本次安装的操作系统是centos7
2. 安装DOCKER步骤
获取rpmdocker文件
下载docker的rpm文件中转站
yum https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
md5校验文件(可忽略)
md5sum https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm ##md5校验
安装docker
rpm -ivh docker-engine-1.7.1-1.el6.x86_64.rpm
yum -y install docker-engine
#镜像加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
如果docker启动报错可修改文件daemon.json(/etc/docker/daemon.json)为以下重试:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
设置docker为自启动
systemctl enable docker#设置开机启动
systemctl disable docker#关闭开机启动
重启docker服务
service docker restart [start, stop, restart, try-restart, reload, force-reload, status] #后面的都是可选项
docker常用命令
docker pull centos:7 #获取镜像文件centos:tag为7
docker version #获取docker版本信息
docker search centos #获取centos镜像信息
docker --help #获取docker命令帮助信息
docker images #获取docker已经安装的镜像列表
docker ps -a/docker ps -n 5 #获取docker创建的容器信息,前者是查看全部,后者是查看前五个
docker run -tid --name tomcat01 ec1acc17f809 /usr/sbin/init #根据一个镜像常见一个操作系统-根据镜像名称ec1acc17f809创建系统名为tomcat01的系统(容器)(固定命令)
docker exec -it tomcat01 /bin/bash #进入一个docker的容器(系统)(固定命令)
docker rm tomcat01 #删除容器(系统)名称为tomcat01的容器
docker rmi ec1acc17f809 或者 docker rmi docker.io/centos:7 #删除镜像id为ec1acc17f809 的容器(或者存在重名,重镜像id的时候,采用仓库名称加冒号加tag信息进行删除)
docker start mysql #启动容器(系统名称为mysql)
docker commit -m "提交为镜像的描述(类似git提交代码的描述)" -a "作者信息" 容器ID(可以简写) 镜像名称 #将容器做成镜像(-m 提示信息 -a 作者 )
docker save -o mysql-and-loadbalance-image.tar 318c2bf36d1f 将镜像打包成一个tar包(-o输出到一个文件,mysql-and-loadbalance-image.tar自己起的tar包文件名,318c2bf36d1f镜像id)
docker load -i /opt/soft_bak/mysql-and-loadbalance-image.tar 将镜像tar文件,copy到另一台主机进行载入
docker tag 3e7767ddd728 geektown/mysql-and-loadbalance-image 导入后未命名,通过tag命令打上标记。
docker inspect 7187b75620b4 |grep IPAddress 查看docker的容器的ip地址(7187b75620b4为容器id)
docker port 44de1b0b5312(容器ID) 查看容器绑定和映射的端口及Ip地址
$ docker run -d -p 5005:5000 -p 5006:80 #容器ID:44e703c1279a 容器启动绑定多IP
杀死所有正在运行的容器: docker kill $(docker ps -a -q)
删除所有停止的容器: docker rm $(docker ps -a -q)
docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
1、从容器里面拷文件到宿主机?
答:在宿主机里面执行以下命令
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?
答案:在宿主机上面执行命令
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
2、从宿主机拷文件到容器里面
答:在宿主机里面执行如下命令
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?
答案:在宿主机上面执行如下命令
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
docker重启容器的环境配置失效
我通过命令docker exec -ti ID /bin/bash进入容器时,发现原来配置在/etc/profile中的环境变量(jre)失效,每次重启都需要执行source /etc/profile才可以重新有效,这样该怎么处理比较好?
我采用的是把变量写入/root/.bashrc这个文件,就会自动读取你的变量了.
指定多个端口映射,容器指定固定ip在创建容器的时候
意思是将宿主机的3306(前)端口映射到宿主机的3306端口和容器的3306端口(后),将宿主机的8084(前)端口映射到容器的8084端口(后),创建一个名称为mysql-master-temp的容器,使用自定义的网段staticnet,指定ip地址192.168.0.6,使用镜像mysql-master-images
docker run -it -d -p 127.0.0.1:3306:3306 -p 8084:8084 --name mysql-master-temp --network staticnet --ip 192.168.0.6 mysql-master-images /usr/sbin/init
删除容器命令:docker rm mysql-master
出现错误:Error response from daemon: Driver overlay2 failed to remove root filesystem 7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74: remove /var/lib/docker/overlay2/4a029deaed28e83f817b500464ff9c829d44139b393e70e914f46c5a68d00e9b/merged: device or resource busy
解决方案:【7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74是上面的错误的信息】
[root@kunzai ~]# grep docker /proc/*/mountinfo | grep 7187b75620b4fa53f5bdaf4e50de0c7e9a152a261c7da1494139a50a7f65db74 | awk -F':' '{print $1}' | awk -F'/' '{print $3}'
24704
24705
将进程杀死
[root@kunzai ~]# kill -9 24704
[root@kunzai ~]# kill -9 24705
重新删除可以了
[root@kunzai ~]# docker rm mysql-master
mysql-master
docker容器与宿主机的时间不一致的问题
情况在现
[root@1006130733e6 boot]# date
Sat May 11 05:58:53 UTC 2019
[root@kunzai zookeeperColony]# date
Sat May 11 13:58:56 CST 2019
解决
1. 共享主机的localtime (方法一)
创建容器的时候指定启动参数,挂载localtime文件到容器内 ,保证两者所采用的时区是一致的。
docker run -d -v /etc/localtime:/etc/localtime --rm -p 8888:8080 tomcat:latest
2. 复制主机的localtime (方法二)
docker cp /etc/localtime 容器名称或id:/etc/
在完成后,再通过date命令进行查看当前时间。
- 但是,在容器中运行的程序的时间不一定能更新过来,比如在容器运行的MySQL服务,在更新时间后,通过sql查看MySQL的时间
select now() from dual;
可以发现,时间并没有更改过来。
这时候必须要重启mysql服务或者重启Docker容器,mysql才能读取到更改过后的时间。
docker开放2375端口
编辑docker文件:/usr/lib/systemd/system/docker.service
vim /usr/lib/systemd/system/docker.service
修改ExecStart行为下面内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
快速安装
yum update
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
使用ali镜像下载安装
安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.设置阿里云镜像源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装 Docker-CE
重建 Yum 缓存。
安装 Docker-CE ,请执行一下命令进行安装:
sudo yum install docker-ce
4.启动 Docker-CE
sudo systemctl enable docker
sudo systemctl start docker
总结
①:docker类似git
docker设置固定ip地址
1. 配置前工作
docker启动的容器指定一个固定ip,我们知道默认情况下,docker会使用bridge网络模式为每一个启动的容器动态分配一个IP,以172.17.0.1为网关,172.17.0.2,172.17.0.3依次类推作为容器的ip,这样也算是每个容器有了ip,当下次启动多个容器的时候IP还是会按照这种方式分配,表面上还是一个固定IP的方式,但是这种方式对容器启动顺序有严格的要求。还有一种方式就是通过人为指定IP的方式
启动容器时可以通过–net=none指定容器网络模式。有四种网络模式可以选择:host,container,none,bridge(默认),如果不设置这个参数,那么默认就是bridge的模式,采用dhcp的方式分配IP
2. docker设置固定ip地址步骤
Docker安装后,默认会创建下面三种网络类型
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
237ea3d5cfbf none null local
启动 Docker的时候,用 --network 参数,可以指定网络类型
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash
- bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了 - none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP - host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。 - 创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下
docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.
- 步骤1: 创建自定义网络
docker network create --subnet=172.18.0.0/16 mynetwork
➜ ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
4f11ae9c85de mynetwork bridge local
237ea3d5cfbf none null local
- 步骤2: 创建Docker容器
docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash
如: 创建一个名为mysql-test的容器,使用上面创建的网段staticnet,指定ip地址192.168.0.6,依据镜像文件my-mysql进行创建
docker run -it --name mysql-test --network staticnet --ip 192.168.0.6 my-mysql /usr/bin/bash
docker动态设置端口映射
查看Container的IP地址
docker inspect <container name or id>| grep IPAddress
查看Container的映射的端口
docker port <container name or id>
如.
docker port d8dac7399647
docker port hfq-jedi-zxf-eden
用iptables查看容器映射情况
iptables -t nat -nvL
iptables -t nat -nvL --line-number
举例新增端口的映射
##将主机31101 映射到 容器 6379端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 31101 -j DNAT --to-destination 192.168.42.2:6379
保存iptables规则
iptables-save
说明
192.168.42.2 是根据 docker inspect <container name or id>| grep IPAddress 的结果
端口映射完毕后,不能通过docker port d8dac7399647查询到结果
可以通过
iptables -t nat -nvL | grep 192.168.42.2
查询 映射关系
如果不行也可使用下面的方法一
DOCKER 给运行中的容器添加映射端口
方法1
1、获得容器IP
将container_name 换成实际环境中的容器名
docker inspect `container_name` | grep IPAddress
2、 iptable转发端口
将容器的8000端口映射到docker主机的8001端口
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
方法2
1.提交一个运行中的容器为镜像
docker commit containerid foo/live
2.运行镜像并添加端口
docker run -d -p 8000:80 foo/live /bin/bash
而我是使用的是以下方法
将容器的192.168.0.2的端口为6379映射到主机的31101端口上
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 31101 -j DNAT --to-destination 192.168.0.2:6379
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
iptables-save
可以通过下面查询 映射关系
iptables -t nat -nvL | grep 192.168.0.2【容器ip】
如果添加错了我是使用下面的方式删除的
使用以下命令查询规则
[root@kunzai ~]# iptables -t nat -nvL --line-number
Chain PREROUTING (policy ACCEPT 1226 packets, 52912 bytes)
num pkts bytes target prot opt in out source destination
1 147 7552 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15672 to:192.168.0.2:15672
2 62 3176 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15673 to:192.168.0.3:15672
3 6 320 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5672 to:192.168.0.2:5672
4 1 40 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5673 to:192.168.0.3:5673
5 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5673 to:192.168.0.3:5672
6 93669 3448K DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
7 0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8085 to:192.168.0.2:8084
删除一条nat 规则
iptables -t nat -D PREROUTING(这个可以选择) 4(这个是数字,就是num下面的数据)
查询指定容器的端口映射
iptables -t nat -nvL | grep 192.168.42.2
linux的知识
- There are unfinished transactions remaining解决方法
# 清除yum缓存
yum clean all
# 运行 yum-complete-transaction,清理未完成事务
yum-complete-transaction --cleanup-only
yum会把下载的软件包和header存储在cache中,而不会自动删除.可用yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all全清.