什么是Docker?
官方解释为一个类似集装箱的东西,把开发完成的应用或程序放到这个集装箱里去运行 ,整个环境都是独立 隔离的互相不干扰而整个docker平台就像一艘大货轮把这些集装箱都放到上面运行。
再举一个例子就是 本来房东要将自己的大房子对外出租 ,每个人睡一张床铺整个房子到处都是大大小小的床 一些生活用品堆的的到处都是,在用水用电等其他公共设施 都在统一的管理下 时间久了非常 繁琐 。
而现在引用docker的概念就是 把每个住户都分成一个小标间隔离起来 里面的水电生活设施都是独立的 住户们自己解决,设计,个性化
安装 Docker:
官方源:
yum install -y yum-utils device-mapper-persistent-data lvm2 //安装依赖
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo //安装yum源
yum -y install docker-ce //安装docker
阿里云源:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
docker-cn 加速:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker-clound 加速:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://6f41b03d.m.daocloud.io
阿里云 加速:
https://cr.console.aliyun.com
{
"registry-mirrors": ["https://widbrt8z.mirror.aliyuncs.com"]
}
登陆 Docker Hub:
docker login --username=qxfell --password=qxfell123 # 登录docker hub
docker tag nginx:v1 qxfell/nginx:v1 # 镜像打标签
docker push qxfell/nginx:v1 # 上传
docker pull qxfell/nginx:v1 # 下载
基本操作命令:
docker search # 查找镜像
docker run # 运行镜像
-d # 后台运行容器
-P # -p 指定端口运行
docker ps -a # 查看所有容器(包括已睡眠) 去掉-a是查找正在运行的
docker run -i -t centos /bin/bash # 与容器产生交互 进入到centos 镜像中
-t # 在新容器内指定一个伪终端或终端
-i # 允许对容器 内的标准输入进行 交互
docker los 容器ID # 查看交互信息日志
docker rm $( docker ps -a -q ) # 清除睡眠的容器
docker run -d -p 8000:5000 training/webapp python app.py # 将docker内部端口映射到本机8000端口
docker logs -f 容器ID # 查看容器的日志 后面加上容器ID即可
docker top 容器ID # 查看容器的进程
docker exec -it 容器ID /bin/bash # 进入指定容器
docker cp 容器ID:/usr/local/ /tmp # 从容器里拷贝文件或目录到本地主机里
ps -a # 查看睡眠的容器 -q 显示容器标签/ID
attach # 容器的标准输入 也就是进入容器里操作
rm # rmi 删除镜像 rm -f 强制删掉所有正在运行的容器
start # 开启容器
stop # 停止容器
kill
pause/unpause
rename # 重命名容器
更多操作:
inspect # 后面加上容器名字 查看容器所有属性信息 常见的网络信息等
exec # -it 标准输入 和 attach 一样 进入模拟终端
top # 查看容器的后台进程
port # 将容器内的某个端口映射到宿主机上
cp # 容器与宿主机之家互相拷贝
diff # 可以看出系统有什么变化
logs # 查看容器的输入日志
stats # 命令用于显示一个或多个容器实时的资源使用情况,包括CPU,内存使用量,网络IO,磁盘IO等信息
update # --image 指定新的镜像 更新镜像版本
events # 从服务器获取实时事件
打包自定义镜像:
docker commit -m="has update" -a="runoob" 容器ID runoob/ubuntu:v2
-m: # 提交的描述信息
-a: # 指定镜像作者
e218edb10161:容器ID
runoob/ubuntu:v2: # 指定要创建的目标镜像名
导入导出镜像:
// 导出
docekr export 容器名 保存的名字.tar
例:docekr export test01 test01.tar
// 导入
docker import 名字.tar 镜像包名字
例: docker import test-01.tar centos
// 完整导出
docker save 镜像名 > 保存的名字.tar
// 完整导入
docker load -i 保存的名字.tar
容器数据持久化:
# 挂载数据卷 将宿主机的目录当作卷 挂载到容器中
docker run -itd -v /data/web:/data --name web01 centos
docker run -itd --volumes-from 容器名 --name web02 centos
# Volume Bind Mount (推荐用这个)
--mount src=nginx-vol,dst=/usr/share/nginx/html # 将容器里的内容挂载到宿主机的数据卷
# 管理卷:
docker volume create 数据卷名 # 创建数据卷
docker volume ls # 查看数据卷
docker volume inspect 数据卷名 # 查看数据卷的信息
# 启动容器 引用mount 根据创建的数据卷 挂载
docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx #
# 指定目录绑定 会替换容器中的内容 当容器里跑的是java应用 就可以把构建的 target/*.war 共享到容器里 直接重启容器就可以完成部署
docker run -d -it --name=nginx-test --mount type=bind src=/wwwroot dst=/usr/share/nginx/html nginx
清理删除容器:
docker container stop nginx-test # 停止容器
docker container rm nginx-test # 删除容器
docker volume rm nginx-vol # 删除数据卷
自定义网段:
# 创建网络
docker network create --subnet-10.0.0.0/16 network_10
docker network ls
# 运行一个网段
docker run -itd --net=network_10 --ip 10.0.0.123 容器名 (centos)
docker inspect 容器名 # 查看容器ip信息
# 容器间通信
--link
docker run -itd --link 之前创建或有的容器名或主机名:新增一台的主机名 容器名
# restart重启
docker run -itd --restart always centos # 不断重启容器
docker run -it --restart always centos # 指定重启3次 onfailure:3
# 容器修改DNS:
docker run -itd --dns 8.8.8.8 镜像名字(centos)
#指定容器的主机名
docker run -itd -h qiangxianfei centos
# -e 传入变量
docker run -itd -e TEST=123 cetnos
docker attach 容器名 # 将变量声明到容器中
3种网络模式:
bridge
默认网络, docker 启动后创建一个docker0 网桥,默认创建的容器也是添加到这个上
host
容器不会获得一个独立的network namespace (命名空间)而是和宿主机公用一个
none
获取独立的network namespace 但不为容器进行任何网络配置
container
与指定的容器使用同一个network namespace 网卡配置也都是相同的自定义
除了容器映射端口以外 还可以用iptables 来让容器对外进行访问 可以PREROUTING (路由前的匹配) 将88 端口转发到容器的80
iptables -t nat -A PREROUTING -d 192.168.80.128 -p tcp --dport 89 -j DNAT --to 172.17.0.2:80
容器配置自定义ip(永久生效)
vi /etc/network/interfaces
auto eth0
iface eth0 inet static
auto br0
iface br0 inet static
address 192.168.1.120
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
bridge_ports eth0
利用pipework 配置容器自定义ip
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin
docker run -itd --net=none --name test01 centos
pipework br0 test01 192.168.1.88/[email protected]
容器开启ssh服务:
# 开启容器之后 进入安装openssh-server 提交一个新的镜像 然后在开启镜像 映射22端口
docker commit test01 centos_ssh
Dockerfile 常用指令:
FROM //构建的新镜像是基于哪个镜像
例 FROM centos6
MAINTAINER // 镜像维护者姓名或邮箱地址
例 MAINTAINER xfell
RUN // 构建镜像时运行的shell命令
例 RUN [ "yum","install","httpd"] 或者 RUN yum install
CMD //运行容器时 执行的shell命令
例 CMD [ "-e" , "./start.sh"]
CMD [ "/usr/sbin/sshd","-D" ]
CMD /usr/sbin/sshd -D
EXPOSE //声明容器运行的服务端口
例 EXPOSE 80 443
ENV // 设置容器内环境变量
例 ENV MYSQL_ROOT_PASSWORD 123456
ADD //拷贝文件或目录到镜像 如果是URL或压缩包
閱讀更多 愛踢人生 的文章