文章目录
Dockerfile基础命令
- FROM - 基于基准镜像
- FROM centos #制作基准镜像(基于centos:lastest)
FROM scratch #不依赖任何基准镜像base image
FROM tomcat: 9.0.22-jdk8-openjdk
尽量使用官方提供的Base Image
- FROM centos #制作基准镜像(基于centos:lastest)
- LABEL & MAINTAINER - 说明信息
- MAINTAINER mashibing.com
LABEL version = “1.0”
LABEL description = “马士兵教育”
- MAINTAINER mashibing.com
- WORKDIR - 设置工作目录
- WORKDIR /usr/local
WORKDIR /usr/local/newdir #自动创建
尽量使用绝对路径
- WORKDIR /usr/local
- ADD & COPY - 复制文件
- ADD hello / #复制到根路径
ADD test.tar.gz / #添加根目录并解压
ADD 除了复制,还具备添加远程文件功能
- ADD hello / #复制到根路径
- ENV - 设置环境常量
- ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
尽量使用环境常量,可提高程序维护性
- ENV JAVA_HOME /usr/local/openjdk8
- 暴露容器端口
- EXPOSE
- docker run -p 8000:8080 tomcat
Dockerfile运行指令
-
RUN & CMD & ENTRYPOINT
- RUN : 在Build构建时执行命令
ENTRYPOINT : 容器启动时执行的命令
CMD : 容器启动后执行默认的命令或参数
- RUN-构建时运行
- RUN yum install -y vim #Shell 命令格式
- 使用Shell执行时,当前shell是父进程,生成一个子shell进程
在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
- 使用Shell执行时,当前shell是父进程,生成一个子shell进程
- RUN [“yum”,“install”,"-y",“vim”] #Exec命令格式
- 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
执行完毕,直接退出,并不会退回之前的进程环境
- 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
- RUN yum install -y vim #Shell 命令格式
- ENTRYPOINT启动命令
- ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
ENTRYPOINT [“ps”] #推荐使用Exec格式
- ENTRYPOINT(入口点)用于在容器启动时执行命令
- CMD默认命令
- CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行
如容器启动时附加指令,则CMD被忽略
CMD [“ps” , “-ef”] #推荐使用Exec格式
- CMD用于设置默认执行的命令
- RUN : 在Build构建时执行命令
-
实验
-
FROM centos RUN ["echo", "image building!!!"] CMD ["echo", "container starting..."] [root@mac_linux docker_run]# docker build -t zdc.com/docker_run . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM centos ---> 831691599b88 Step 2/3 : RUN ["echo", "image building!!!"] ---> Running in efb2ba63586d image building!!! #镜像构造时会运行 Removing intermediate container efb2ba63586d ---> a3149dd07315 Step 3/3 : CMD ["echo", "container starting..."] ---> Running in 5494ecc5183d Removing intermediate container 5494ecc5183d ---> ac3fed96c1eb Successfully built ac3fed96c1eb Successfully tagged zdc.com/docker_run:latest [root@mac_linux docker_run]# docker run zdc.com/docker_run container starting... #容器启动时会运行 [root@mac_linux docker_run]# docker run zdc.com/docker_run ls #如果启动容器时指定了ls这个指令 cmd会被忽略 bin dev etc home lib lib64 lost+found #修改Dockerfile文件 FROM centos RUN ["echo", "image building!!!"] ENTRYPOINT ["echo", "container starting..."] [root@mac_linux docker_run]# docker build -t zdc.com/docker_run . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM centos ---> 831691599b88 Step 2/3 : RUN ["echo", "image building!!!"] ---> Using cache ---> a3149dd07315 Step 3/3 : ENTRYPOINT ["echo", "container starting..."] ---> Running in af85e6d896db Removing intermediate container af85e6d896db ---> 5f1824830fab Successfully built 5f1824830fab Successfully tagged zdc.com/docker_run:latest [root@mac_linux docker_run]# docker run zdc.com/docker_run container starting... #此时与cmd的区别 #再修改Dockerfile文件 FROM centos RUN ["echo", "image building!!!"] ENTRYPOINT ["ps"] CMD ["ef"] [root@mac_linux docker_run]# docker build -t zdc.com/docker_run . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 831691599b88 Step 2/4 : RUN ["echo", "image building!!!"] ---> Using cache ---> a3149dd07315 Step 3/4 : ENTRYPOINT ["ps"] ---> Running in 4e9f64968cff Removing intermediate container 4e9f64968cff ---> 2bc580ec7098 Step 4/4 : CMD ["ef"] ---> Running in 501245cc9132 Removing intermediate container 501245cc9132 ---> eec1f9cc691a Successfully built eec1f9cc691a Successfully tagged zdc.com/docker_run:latest [root@mac_linux docker_run]# docker run zdc.com/docker_run PID TTY STAT TIME COMMAND #ENTRYPOINT ["ps"] CMD ["ef"]联合使用 [root@mac_linux docker_run]# docker run zdc.com/docker_run -aux #如果给了aux参数 会代替cmd命令 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 47496 1796 ? Rs 13:30 0:00 ps -aux
ENTRYPOINT一定会被执行,如果有多个 只有最后一个执行。
运行时如果指定了参数CMD会被忽略
如果ENTRYPOINT和CMD同时存在,会结合,而且如果指定了参数,CMD会被忽略。
-
REDIS的镜像构建
-
FROM centos RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"] WORKDIR /usr/local ADD redis-4.0.14.tar.gz . #.代表工作目录 WORKDIR /usr/local/redis-4.0.14/src RUN make && make install WORKDIR /usr/local/redis-4.0.14 ADD redis-7000.conf . #放置配置文件 EXPOSE 7000 #对外暴露7000端口号 CMD ["redis-server","redis-7000.conf"]
docker built -t zdc.com/docker-redis . docker run -d -p 7000:7000 zdc.com/docker-redis
-
reids在docker hub中已经存在
清空docker images
-
1.进入root权限 sudo su 2.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker rm $(docker ps -a -q) 3.查看当前有些什么images docker images 4.删除images,通过image的id来指定删除谁 docker rmi <image id> 想要删除untagged images,也就是那些id为<None>的image的话可以用 docker rmi $(docker images | grep "^<none>" | awk "{print $3}") 要删除全部image的话 docker rmi $(docker images -q)
容器间的单向访问
-
容器内部有一个虚拟IP,但docker每创建出一个container,IP地址都会发生改变。所以容器间进行通信时不建议使用IP。
-
给每个容器起一个名字,通信时使用名字。 –name指定名字 inspect 查看容器原始配置信息 看一看虚拟IP。–link containerName
-
docker run -d --name web tomcat docker run -d --name database -it centos /bin/bash docker inspect id //查看ip #两个容器间的ip是互通的 docker run -d --name web --link database tomcat #tomcat内部可以ping database 通过名字可以ping通
-
Bridge网桥双向通信
-
<img src=“docker.assets/image-20200718233118747.png” alt=“image-20200718233118747” styl
=“zoom:50%;” />- docker network ls docker network create -d bridge my-bridge docker network connect my-bridge xxx
[root@mac_linux docker-redis]# docker run -d --name web tomcat 1859441a12746353a824f4af9a7626279be62f39da1beefbfa933ed4eba6329f [root@mac_linux docker-redis]# docker run -d --name database -it centos /bin/bash dadb1b4f5e13ac1272d1894178e72cd7f2468d5e811472f3f96cc75192d19f0a [root@mac_linux docker-redis]# docker network ls NETWORK ID NAME DRIVER SCOPE c354ebcdf1d7 bridge bridge local #默认网桥 与 da545125e8f9 host host local 09bbd93c6126 none null local [root@mac_linux docker-redis]# docker network ls NETWORK ID NAME DRIVER SCOPE c354ebcdf1d7 bridge bridge local da545125e8f9 host host local 4ba7cd11b3d4 my-bridge bridge local 09bbd93c6126 none null local [root@mac_linux docker-redis]# docker network connect my-bridge web #两个容器都绑定到该网桥 这样就可以互通了 [root@mac_linux docker-redis]# docker network connect my-bridge database
- 通过虚拟网卡做地址转换通过物理网卡到外部 外部到容器反之。
Volume容器间共享数据
宿主机的文件共享到其他容器。
-
方法
-
通过设置-v挂载宿主机目录 -v
-
格式: docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名 实例: docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat //路径不存在 宿主机和容器都会创建
-
-
通过–volumes-from 共享容器内挂载点 **创建一个容器,让它作为共享容器 修改挂载路径,只需修改这个即可 **
–volumes-from
-
docker create --name webpage -v /usr/webapps:/usr/local/tomcat/webapps tomcat /bin/true docker run --volumes-from webpage --name t1 -d tomcat
-
-
Docker-compose
-
Docker Compose
- Docker Compose 单机多容器部署工具
- 通过yml文件定义多容器如何部署
- WIN/MAC默认提供Docker Compose,Linux需安装
-
安装docker compose
-
实验
-
For example, if you named your directory
my_wordpress
:cd my_wordpress/
Create a
docker-compose.yml
file that starts yourWordPress
blog and a separateMySQL
instance with a volume mount for data persistence:version: '3.3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {}
run
docker-compose up -d
from your project directory.
-
部署实例
zhangdacheng@zhangdachengdeMacBook-Pro bsbdj % tree
.
├── bsbdj-app
│ ├── Dockerfile
│ ├── application-dev.yml
│ ├── application.yml
│ └── bsbdj.jar
├── bsbdj-db
│ ├── Dockerfile
│ └── init-db.sql
└── docker-compose.yml
FROM openjdk:8u222-jre
WORKDIR /usr/local/bsbdj
ADD bsbdj.jar .
ADD application.yml .
ADD application-dev.yml .
EXPOSE 80
CMD ["java","-jar","bsbdj.jar"]
FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql .
version: '3.3' #
services:
db: #为创建的容器起名字 也是通信的主机名
build: ./bsbdj-db/
restart: always #容器down掉后,会重新启动新容器进行替换
environment: #启动容器时 会执行这个命令
MYSQL_ROOT_PASSWORD: root
app:
build: ./bsbdj-app/
depends_on: #设置依赖, 容器的依赖,设置网络上的互通
- db
ports:
- "80:80" #端口映射
restart: always
- 命令
docker-compose up -d
docker-compose logs '
#查看日志
docker-compose down
删除容器
-
mysql
-
容器启动时设置密码
-
docker run -d -e MYSQL_ROOT_PASSWORD=root mysql
-
-
初始化数据库 把sql文件放入docker-entrypoint-initdb.d目录即可
-
WORKDIR /docker-entrypoint-initdb.d ADD init-db.sql .
-
-
将spring boot项目成jar包,并把配置文件等放在jar包外部 https://blog.csdn.net/pei19890521/article/details/80984707
上传到dockerhub上
在dockerhub上创建swagger:
docker tag calix-swagger:latest zdcsmart/calix-swaggerdocker push zdcsmart/calix-swagger
docker push zdcsmart/calix-swagger