docker是一个提供应用打包,部署与运行应用的容器化平台。
应用程序 -> docker引擎-> 物理硬件
应用程序不再直接面向底层资源,而是面向中间层docker引擎来操作。
docker引擎包含:docker服务端, rest api ,docker客户端。
通过这种结构,用户可以通过客户端很方便的管理多个服务端。
镜像:镜像是只读文件,提供运行程序完整的软硬件资源。
容器:容器是镜像的实例,由docker负责创建,容器之间彼此隔离。
docker pull redis
客户端 --> Docker Daemon 检查redis镜像,若本地不存在-> 从远程中央仓库获取镜像
docker run redis
客户端->Docker Daemon redis镜像存在->创建容器,由redis对外暴露服务,对内容器就是一个完整的centos系统。
docker run -p 8000:8080 -d tomcat:latest # 在容器中部署最近版本的tomcat hub.docker.com # 端口映射-p 8000:8080 8000为宿主机端口,8080为tomcat端口 # -d 后台运行
以tomcat容器为例: 包含tomcat, jdk, mini版linux系统
docker exec -it【交互式方式执行命令】容器id/容器name 命令
docker exec -it cc0ebcaaef7a /bin/bash 进入容器bash
FROM tomcat:latest MAINTAINER yz.com WORKDIR /usr/local/tomcat/webapps ADD docker-web ./docker-web
# 在Dockerfile目录下执行打包 docker build -t yz.com/mywebapp.0.1 . # 运行容器 docker run -p 8001:8080 yz.com/mywebapp.0.1 # 访问 http://localhost:8001/docker-web/index.html
FROM java:8 MAINTAINER yz.com WORKDIR /usr/local/apps/jars ADD xx.jar ./xx.jar ENTRYPOINT ["nohup","java","-jar","xx.jar","&"]
Sending build context to Docker daemon 3.584kB Step 1/4 : FROM tomcat:latest ---> 2ae23eb477aa Step 2/4 : MAINTAINER yz.com ---> Using cache ---> b0efa3602df6 Step 3/4 : WORKDIR /usr/local/tomcat/webapps ---> Using cache ---> bf93f5630ca1 Step 4/4 : ADD docker-web ./docker-web ---> Using cache ---> 603504ab383f Successfully built 603504ab383f Successfully tagged dmall.com/inventory-app:0.2
每一个步骤都会产生一个临时的镜像, —> Using cache 代表会使用之前执行过的步骤缓存。
FROM centos # 制作基准镜像(基于centos) FROM scratch # 不依赖任何镜像 # 尽量使用官方的Base Image MAINTAINER yz.com LABEL version = "1.0" LABEL description = "镜像描述" WORKDIR /usr/local/xx # 工作路径,尽量使用绝对路径,会自动创建目录,并cd到当前目录 ADD xx.jar ./ #复制xx.jar文件到 工作路径 ADD test.tar.gz / #添加到根目录并解压 ENV JAVA_HOME /usr/local/java8 # 设置环境常量
# 不同的执行时机。 RUN xx #在build 构建时执行命令 ENTRYPOINT xx #容器启动时执行命令 CMD xx #容器启动后执行默认的命令或参数
RUN yum install -y vim #shell 命令格式 RUN ["yum","install","-y","vim"] #Exec 命令格式
使用shell执行时,当前shell是父进程,生成一个子shell进程, 在子shell中执行脚本。
脚本执行完毕,退出子shell,回到当前shell。
使用Exec方式,会用Exec进程替换当前进程,并且保持pid不变。
执行完毕,直接退出,并不会退回之前的进程环境。
ENTRYPOINT(入口点)用于在容器启动时执行命令。
Dockerfile中只有最后一个ENTRYPOINT会被执行。
推荐使用 exec格式
ENTRYPOINT一定会执行。
CMD用于设置默认执行的命令
如果Dockerfile中出现多个CMD,则只有最后一个被执行。
如容器启动时附加指令,则CMD被忽略。
推荐使用Exec格式执行命令
CMD不一定会被执行,如docker run yz.com/test_cmd:0.1 ls 后面跟一个命令之后,会替换cmd命令。
# 下载redis 源码 wget http://download.redis.io/releases/redis-5.0.9.tar.gz
编写Dockerfile文件
FROM centos RUN ["yum", "install", "-y", "gcc", "gcc-c++", "net-tools", "make"] WORKDIR /usr/local ADD redis-5.0.9.tar.gz ./ WORKDIR /usr/local/redis-5.0.9/src RUN make && make install WORKDIR /usr/local/redis-5.0.9/ ADD redis-6379.conf ./ EXPOSE 6379 CMD ["redis-server", "redis-6379.conf"]
# 构建redis镜像 docker build -t xx.com/redis-6379 ./ # 运行redis容器 docker run -p 6379:6379 xx.com/redis-6379 # 启动关闭容器 docker start containerId docker stop containerId
因为容器每次启动都会分配新的ip,那么怎么在容器间有效的通信呢?
# 创建redis 6379 docker run -p 6379:6379 -d --name redis6379 redis # 创建centos link redis6379 docker run --name centos --link redis6379 -it centos /bin/bash # 测试能够顺利ping通 ping redis6379 64 bytes from redis6379 (172.17.0.4): icmp_seq=1 ttl=64 time=0.061 ms
# 查看docker网络 docker network ls NETWORK ID NAME DRIVER SCOPE 6b60f6c242a3 bridge bridge local b51d649d7adb host host local 6c0f31888ef7 none null local # 创建新的网桥 docker network create -d bridge my-bridge # 查看网络 docker network ls NETWORK ID NAME DRIVER SCOPE 6b60f6c242a3 bridge bridge local b51d649d7adb host host local 68aa95b088c3 my-bridge bridge local 6c0f31888ef7 none null local # 新开两个centos容器 docker run -dit --name os1 centos docker run -dit --name os2 centos # 绑定到my-bridge docker network connect my-bridge os1 docker network connect my-bridge os2 # 进入os1 ping os2 docker exec -it os1 bash ping os2 PING os2 (172.18.0.3) 56(84) bytes of data. 64 bytes from os2.my-bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.032 ms # 进入os2 ping os1 ping os1 PING os1 (172.18.0.2) 56(84) bytes of data. 64 bytes from os1.my-bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.032 ms
宿主机挂载一个卷, 多个容器共享同一个卷的数据。
# 通过-v挂载宿主机目录 docker run --name os3 -dit -v /root:/mnt/root centos bash docker exec -it os3 bash ls /mnt/root
# 创建共享容器 docker create --name webapp -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat /bin/true # 共享容器挂载点 docker run --volumes-from webapp --name tomcat2 -p 18002:8080 -d tomcat # 访问宿主机18002端口,发现生效
利用这个特性可以将宿主机上面的静态资源如页面文件,共享给容器的资源目录
本文由 奔跑的杂粮煎饼 发布~