DOCKER的安装与学习

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删除容器时报错

删除容器命令: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全清.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章