学习中的疑问:
原来针对某应用的各种配置,如何实现?比如nginx有各种细节配置,使用docker之后怎么实现这些配置?
解决的问题
- dev环境和线上环境不一致的问题
环境配置重复部署的问题(docker可以将项目与环境一起打包)
常用命令
run的参数可以参考:docker run 参数
# 批量删除所有镜像(删除容器同理,-q表示简洁打印,只打印对应的id)docker rmi -f $(docker images -aq)或者:docker images -ap|xargs docker rmi -f# 修改tag信息docker tag <old_image_name:tag> <new_image_name:tag># 以交互的方式启动镜像## append_command表示容器启动后,在容器中执行的一条命令,只能有一条docker run -it <image_name> <append_command># 以“用完即删”的方式启动镜像docker run --rm <image_name># 指定映射,前面的表示外面的docker run -p <out_port>:<in_port> <image_name># 修改容器名称docker rename <old_name> <new_name># 打印日志-f:滚动显示-t:时间戳docker logs -ft --tail <要显示的日志条数># 查看容器中的进程信息docker top <container_name># 进入运行中的容器## 开启一个新的bash:docker exec -it <container_name> /bin/bash## 进入正在运行bashdocker attach <container_name># 退出容器## 关闭正在运行的终端exit## 不关闭正在运行的终端ctrl+p然后ctrl+q# 查看容器信息docker inspect <container_name># 拷贝文件到宿主机docker cp <container_name>:/home/demo.txt /home/demo.txt# 提交容器为一个新的副本(相当于创建了一个快照)docker commit -m="提交的信息" -a="作者" <容器id或者容器名称> <目标镜像名称>:<tags># 挂载数据卷(如果主机目录或者容器内目录不存在,则创建该目录)## 数据卷名称为可选,不能以‘/’开始!如果不指定,docker会随机分配一个名称## 主机目录可选,如果不指定,将由docker管理映射路径(默认在/var/lib/docker/volumns目录下)## ro表示内部只读(只能由容器外写入),rw表示可写,可选docker run -it -v <数据卷名称>:<主机目录>:<容器目录>:<ro或者rw># 查看数据卷详情docker volumn inspect <数据卷名称># 查看镜像的构建历史docker history <image_name># 共享其他容器的数据卷(该操作将使得容器2创建和容器1相同的数据卷)docker --volumes-from <another_container># 登录并且提交镜像docker login -u <username>docker push <image_name>
dockerfile
构建命令
docker build -f <dockerfile的路径> -t <构建后的镜像名称>:<tag> <构建使用到的目录>## 示范docker buile -f dockerfile -t jacketzc/centos .
dockerfile脚本
格式:
# CommentINSTRUCTION arguments
说明:
每一行指令docker都会尽可能为其构建一层镜像
- 也就是说上一行执行的 cd /home在下一行没有作用
- 指令不区分大小写,但是建议大写便于区分参数
基本指令:
FROM # 构建镜像所依赖的镜像# 示范:FROM centos:7.0MAINTAINER # 维护者信息#示范:MAINTAINER jacketzc<jacketzc@outlook.com>ENV # 定义环境变量(相当于-e)# 示范:ENV abc=helloWORKDIR ${abc}# 变量在同一行具有唯一值# 可以通过此命令在系统环境中追加环境:(此处以配置jdk的环境变量作为示范 )ENV PATH $PATH:$JAVA_HOME/binRUN # 构建镜像的时候所需要执行的命令# 示范:RUN yum -y install net-toolsADD # 构建镜像时,所使用到的本地资源# 示范:将构建目录的压缩包解压到镜像对应的目录中ADD jdk-8-tar.gz /usr/local# ADD 会自动解压压缩包WORKDIR # 运行容器后,默认进入的目录VOLUMN # 指定挂载的目录(相当于-v)EXPOSE # 指定暴露的端口(相当于-p)CMD # 相当于run镜像时的附加命令,只有最后一个CMD会生效# 示范:CMD /bin/bashENTRYPOINT # 追加命令,所有命令都会拼接在该命令之后# 示范:ENTRYPOINT ["ls", "-a"]此时run该镜像时如果附加命令-l,那么相当于执行了ls -a -lONBUILD #COPY # 类似ADD,将文件拷贝到镜像中# 示范:将构建目录的文件拷贝到镜像对应的目录中cp readme.txt /usr/local
docker网络
桥接模式:就是默认模式,docker会给容器创建一个虚拟网卡、分配一个ip,主机与容器可以相互ping,容器之间也可以相互ping(通过veth-pair技术相连)
默认配置文件目录为:/etc/mysql/conf.d
数据文件目录为:/var/lib/mysql
docker pull mysql:5.7# 简单启动docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7# 映射配置文件目录以及数据文件目录docker run -d -p 3310:3306 --name mysql01 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
构建jdk、tomcat环境
准备一个目录,其中包含:
- linux版本的jdk压缩包
- tomcat压缩包
- DockerFile
- readme.txt
- DockerFile参考:
```dockerfile
FROM centos
MAINTAINER 已被弃用,建议使用LABEL为镜像设置meta信息
MAINTAINER jacketzcjacketzc@outlook.com
LABEL MAINTAINER=”jacketzcjacketzc@outlook.com“
COPY readme.txt /home/ ADD jdk-8u281-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.61.tar.gz /usr/local
RUN yum -y install nano
ENV mypath /usr/local WORKDIR $mypath ENV JAVA_HOME /usr/local/jdk1.8.0_281 ENV CLASSPATH . ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.61 ENV CATALINA_BASH apache-tomcat-8.5.61 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.61/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.61/logs/catalina.out
<a name="zgLLQ"></a>### 构建jenkins+node+maven环境镜像```dockerfileFROM jenkinsLABEL MAINTAINER="jacketzc<jacketzc@outlook.com>"# if we want to install via aptUSER root# USER jenkins # drop back to the regular jenkins user - good practiceADD node-v14.16.1-linux-x64.tar /usr/localADD apache-maven-3.5.2-bin.tar.gz /usr/localCOPY sources.list /etc/apt/ENV mypath /usr/localWORKDIR ${mypath}ENV MAVEN_HOME /usr/local/apache-maven-3.5.2/ENV NODE_HOME /usr/local/node-v14.16.1-linux-x64/ENV PATH $PATH:${MAVEN_HOME}/bin:${NODE_HOME}/bin# RUN apt-get update \# && apt install -y nano \RUN ln -s /usr/local/node-v14.16.1-linux-x64/bin/npm /usr/bin/npm \&& ln -s /usr/local/node-v14.16.1-linux-x64/bin/node /usr/bin/node \&& npm config set registry https://registry.npm.taobao.org
构建ELK
# 先创建一个ELK共享的网络docker network create ELK# 开启ES(单机模式)docker run -d --name elasticsearch --net ELK -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.4# 开启kibanadocker run -d --name kibana --net ELK -p 5601:5601 kibana:7.17.4
安装minio
minio的集群并不需要额外的配置文件
# 单机# server /data表示数据存储的位置 {1...2}会创建/data1、/data2来存储数据,如果需要持久化,用-v将这些目录映射# --console-address表示指定一个控制台的端口,需要使用-p暴露该端口,该端口不能和api的一样docker run -d \-p 9000:9000 \-p 9001:9001 \--name minio1 \-v /home/minio/data/update:/data1 \-v /home/minio/data/backup:/data2 \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=admin123" \minio/minio server /data{1...2} --console-address ":9001"# 集群
日常
修改容器内的配置文件
场景:容器没有提供文本编辑器,但是还是要修改
思路:把容器中的配置文件复制出来,修改后再复制进去
# 复制docker cp mysql:/etc/mysql/my.cnf /usr/local/mysql/my.cnf# 修改后替换docker cp /usr/local/mysql/my.cnf mysql:/etc/mysql/my.cnf
将镜像导出/导入
# 导出docker save <image_name> <xxx.tar># 导入docker load< <xxx.tar>
