学习中的疑问:
原来针对某应用的各种配置,如何实现?比如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
## 进入正在运行bash
docker 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脚本
格式:
# Comment
INSTRUCTION arguments
说明:
每一行指令docker都会尽可能为其构建一层镜像
- 也就是说上一行执行的 cd /home在下一行没有作用
- 指令不区分大小写,但是建议大写便于区分参数
基本指令:
FROM # 构建镜像所依赖的镜像
# 示范:FROM centos:7.0
MAINTAINER # 维护者信息
#示范:
MAINTAINER jacketzc<jacketzc@outlook.com>
ENV # 定义环境变量(相当于-e)
# 示范:
ENV abc=hello
WORKDIR ${abc}
# 变量在同一行具有唯一值
# 可以通过此命令在系统环境中追加环境:(此处以配置jdk的环境变量作为示范 )
ENV PATH $PATH:$JAVA_HOME/bin
RUN # 构建镜像的时候所需要执行的命令
# 示范:
RUN yum -y install net-tools
ADD # 构建镜像时,所使用到的本地资源
# 示范:将构建目录的压缩包解压到镜像对应的目录中
ADD jdk-8-tar.gz /usr/local
# ADD 会自动解压压缩包
WORKDIR # 运行容器后,默认进入的目录
VOLUMN # 指定挂载的目录(相当于-v)
EXPOSE # 指定暴露的端口(相当于-p)
CMD # 相当于run镜像时的附加命令,只有最后一个CMD会生效
# 示范:
CMD /bin/bash
ENTRYPOINT # 追加命令,所有命令都会拼接在该命令之后
# 示范:
ENTRYPOINT ["ls", "-a"]
此时run该镜像时如果附加命令-l,那么相当于执行了ls -a -l
ONBUILD #
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环境镜像
```dockerfile
FROM jenkins
LABEL MAINTAINER="jacketzc<jacketzc@outlook.com>"
# if we want to install via apt
USER root
# USER jenkins # drop back to the regular jenkins user - good practice
ADD node-v14.16.1-linux-x64.tar /usr/local
ADD apache-maven-3.5.2-bin.tar.gz /usr/local
COPY sources.list /etc/apt/
ENV mypath /usr/local
WORKDIR ${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
# 开启kibana
docker 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>