学习docker,有本文就够了

什么是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或压缩包


分享到:


相關文章: