Docker 是一个用于开发,发布和运行应用程序的开放平台。通俗地讲,Docker 类似于集装箱。在一艘大船上,各种货物要想被整齐摆放并且相互不受到影响,我们就需要把各种货物进行集装箱标准化。有了集装箱,我们就不需要专门运输水果或者化学用品的船了。我们可以把各种货品通过集装箱打包,然后统一放到一艘船上运输。Docker 要做的就是把各种软件打包成一个集装箱(镜像),然后分发,且在运行的时候可以相互隔离。
Docker简介
概述
docker是基于go语言实现的虚拟化容器技术,正如他的log描述的一样,容器是完全使用沙箱机制,都有独立的运行环境,更重要的是容器性能开销极低
优点
- 快速,一致地交付您的应用程序(快速CI/DI)
- 响应式部署和扩展(基于容器,快速扩展)
- 在同一硬件上运行更多工作负载(基于虚拟环境)
三个基本概念
- 镜像(image):docker镜像,就相当于电脑安装系统的那个镜像文件,类似于面向对象程序设计里面的类的概念
- 容器(container):docker容器,源于镜像,类似于面向对象程序设计里面的对象,有创建,启动,停止,删除等操作,一个镜像可以运行多个容器
- 仓库(repository):仓库可以看做是镜像的版本控制中心,存放镜像的
架构
Docker 整体架构采用 C/S(客户端 / 服务器)模式,主要由客户端和服务端两大部分组成。客户端负责发送操作指令,服务端负责接收和处理指令。客户端和服务端通信有多种方式,既可以在同一台机器上通过UNIX套接字通信,也可以通过网络连接远程通信。
Docker常用命令及相关参数说明
容器创建并运行
[root@juejinnode1 ~]# docker run 容器创建并运行命令(docker create 只创建不运行)
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="juejin-demo": 为容器指定一个名称;
-h "yanqingnode1": 指定容器的hostname;
-e username="xxx": 设置环境变量;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--volume , -v: 绑定一个卷
示例:docker 运行一个nginx
docker run --name nginx -p 8090:80 -v /data:/data -d nginx:latest
容器的生命周期
通过docker create命令生成的容器状态为初建状态,初建状态通过docker start命令可以转化为运行状态,运行状态的容器可以通过docker stop命令转化为停止状态,处于停止状态的容器可以通过docker start转化为运行状态,运行状态的容器也可以通过docker pause命令转化为暂停状态,处于暂停状态的容器可以通过docker unpause转化为运行状态 。处于初建状态、运行状态、停止状态、暂停状态的容器都可以直接删除。
#启动/停止/重启 容器
docker start/stop/restart 容器名称
#强制删除正在运行的容器
docker rm -f 容器名称/容器id
#查看所有正在运行的容器
docker ps (-a 查看所有的容器)
#查看容器的信息 docker inspect | grep IPADDRESS 查看容器的ip
docker inspect 容器名称
#查看容器的进程信息
docker top 容器名称
#查看容器指定日期多少条日志
docker logs --since="2016-07-01" --tail=100 容器名称
#查看容器的端口映射情况
docker port 容器名称
#从容器创建一个新的镜像。-a 作者 -m 描述 -p提交时停止容器
docker commit -a "runoob.com" -m "my apache" 容器id mymysql:v1
#将主机/usr/test.txt 目录拷贝到容器96f7f14e99ab的/www目录
docker cp /usr/test.txt juejin:/usr 下。
#检查容器里文件结构的更改。
docker diff mymysql
#登陆容器仓库
docker login -u 用户名 -p 密码 xxx(仓库地址)
#登出
docker logout
#拉去镜像,如果不指定版本,默认最新版本latest
docker pull 镜像名称:版本
#上传本地镜像myapache:v1到镜像仓库中。
docker push myapache:v1
# 搜索镜像名包含java,并且收藏数大于10的镜像
docker search -s 10 java
#查看所有的镜像
docker images
#删除镜像
docker rmi 镜像id
#查看本地镜像runoob/ubuntu:v3的创建历史。
docker history runoob/ubuntu:v3
#将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
#将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。
docker tag ubuntu:15.10 runoob/ubuntu:v3
#导入镜像包含记录数据
docker load -a xxx.tar
#打包 --build-arg 指定构建参数 -f 指定DockerFile文件
-t 指定镜像地址、名称、版本,切记最后.必须有代表镜像构建时打包上传到Docker引擎中的文件的目录
docker build --build-arg env=dev -t 127.0.0.1:8092/juejin-system:1.0.0-SNAPSHOT .
#查看docker系统信息
docker info
#显示 Docker 版本信息
docker version
#创建网络模式为bridge的名字为bro的网络
docker network create –driver=bridge br0
Docker网络模式:
容器运行网络模式 通过 --net=xxx 指定具体的网络模式
- --net=bridge 默认的网桥
- --net=host 告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。 容器进程可以跟主机其 它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情, 比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈
- --net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制, 但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信
- --net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置
查看docker下的所有的网络
[root@xhzxnode1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b296c30530bd bridge bridge local
3289812307ba docker_gwbridge bridge local
5ef4a791a309 host host local
b60571a826c6 none null local
52ea1f33c52f juejin_overlay overlay global
未完待续...
最后
还是希望大家多自己去动手实践,掌握基本用法,熟能生巧!!!记得转发收藏点赞三连哦~
附录
我是颜青,不是颜真卿,一个奋斗在互联网一线的小开发