文章目录
docker使用记录:
一、基础命令
-
测试docker是否安装成功:
docker pull hello-world
并运行:docker run hello-world
-
联网搜索镜像,例如:
docker search java
-
下载镜像:
docker pull java
-
自己构建image:
4.1 需要写Dockerfile,例如:# 基于centos7的docker FROM centos:7 # ADD命令的压缩文件会自动解压 ADD myserver-0.0.1-SNAPSHOT.tar.gz /opt/ ADD jdk-8u291-linux-x64.tar.gz /usr/local # 添加环境变量 ENV JAVA_HOME=/usr/local/jdk1.8.0_291 ENV JRE_HOME=${JAVA_HOME}/jre ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH ENV JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin ENV PATH=$PATH:${JAVA_PATH} ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 EXPOSE 8080 # 暴露端口 CMD /opt/myserver-0.0.1-SNAPSHOT/bin/start.sh # CMD会执行命令,容器启动时执行
4.2 在Dockerfile所在目录,执行:
docker build -t 镜像名 .
4.3 如果build成功,执行docker images -a
查看当前设备上所有的镜像;可以执行命令:docker run -p 8900:8900 -d 镜像名
,启生成一个容器,并运行,若容器中没有后台进程在运行,则容器状态会由Up转为Exited,例如上述的hello-world运行后立马转为Exited;-p是将容器中的端口与宿主机的端口进行映射, -d是后台运行。
执行docker ps -a
可以查看所有的容器
4.4 每执行一次run都会生成一个container,如果生成的container是运行状态(Up状态)的话,则可以进入容器中:
docker exec -it 容器id /bin/bash
;
其中查询容器id:docker ps -a
,如果不加-a则表示只查询正在运行状态的容器
4.5 退出容器:exit
-
将宿主机中的文件复制到容器中:
docker cp 宿主机文件 容器id:容器内部路径
-
将容器中的文件复制到宿主机中:
docker cp 容器id:容器内部文件 宿主机文件
-
容器启动:
docker start 容器id
, 容器停止:docker stop 容器id
-
删除容器:
docker rm 容器id
可以同时删除多个容器,多个id之间使用空格连接 -
删除镜像:
docker rmi 镜像名
-
docker服务启动:
systemctl start docker
-
镜像导出导入:
docker save 镜像名 > 文件名.tar, docker load < 文件名.tar
, 只会导出制作build后生成的镜像,如果在后续启动了一个容器,并且在容器内部新增的操作都不会被导出。 -
容器导出导入:
docker export 容器id > 文件名.tar, docker import 文件名.tar 镜像名
,会导出当前容器中的状态。
二、docker-compose 的使用
1. 安装
进入GitHub,找到docker-compose的某一个版本,例如:https://github.com/docker/compose/releases/tag/v2.20.2
根据自己设备系统的版本,找到对应的包,例如:docker-compose-linux-x86_64
,下载完成后放到设备上的/usr/local/bin/
目录下,并重命名为docker-compose
,安装完成。执行docker-compose --version
可以看当前安装的版本号。
2.制作docker-compose.yaml文件
主要目的是通过脚本,将多个容器一次全部启动。
此处需要启动redis、MySQL、自己的springboot服务
制作过程:由于之前未使用过docker,首先是一个镜像一个镜像的配置
- 自己的springboot服务
首先服务需要java环境,可以直接通过docker pull java:8
获取java的镜像,再将容器进行启动,发现在镜像中缺少很多基础Linux命令,例如vi, ps ,netstat等等,且本地网络中无法直接通过网络安装对应的命令,所以改为使用基于centos:7的镜像,根据自己的需求build一个镜像,前面给的Dockerfile内容就是使用到的Dockerfile;如果后续需要在别的设备上使用该镜像,可以将镜像进行导出, 由于没有在容器中进行修改文件,此处直接使用docker save
, 使用时则使用docker load
导入。可以将一些配置文件进行挂载,后续在启动容器之前,直接可以直接修改宿主机的文件就可以,例如连接的mysql配置等等。 - redis
由于redis我没有做任何配置,直接进行docker pull redis
拉取镜像,可以根据自己版本需求进行获取 - Mysql
也是直接拉取镜像,可以根据自己版本需求进行获取。
在设备上将所有的镜像导入后,可以开始制作docker-compose.yaml文件,文件中用到的镜像如果宿主机中不存在的话,则会自动拉取,若设备不能联网,先将镜像准备好。
docker-compose启动方法:
在docker-compose.yaml文件所在路径执行docker-compose up -d
, -d表示后台执行
最终的docker-compose.yaml文件内容:
version: "3.7"
services:
redis:
image: "redis:latest"
# 给容器一个name
container_name: myredis
ports:
#TCP 端口映射
- 6379:6379
command: /usr/local/bin/redis-server &
mysql:
image: "mysql:5.7.36"
container_name: my-mysql
ports:
- 3306:3306
# 启动后需要进行一个初始化的sql
command:
--init-file /opt/mysql/init.sql
environment:
# 设置root账号的密码
MYSQL_ROOT_PASSWORD: topsec
TZ: Asia/Shanghai
LANG: en_US.UTF-8
# 挂载文件:将使用到的初始化sql脚本,挂载到容器中
volumes:
- "./sql/init.sql:/opt/mysql/init.sql"
nginx:
image: "ngin-ubuntu:latest"
container_name: my-nginx
ports:
- 80:80
- 443:443
# 挂载自己的nginx启动配置,nginx镜像是直接通过docker pull nginx进行获取的,nginx的默认启动配置为/etc/nginx/nginx.conf,所以此处将自己的配置文件挂载在对应的路径,进行覆盖
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
# comman命令类与是Dockerfile中CMD命令,如果此处进行了设置,则Dockerfile中的CMD命令不会执行,此处设置的是将nginx启动
command: /bin/bash -c "nginx -g 'daemon off;'"
elasticsearch:
image: "elasticsearch:7.11.2"
container_name: my-es
ports:
- 9200:9200
- 9300:9300
environment:
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
- "discovery.type=single-node"
myserver:
image: "myserver-centos:latest"
container_name: my-file
ports:
- 8900:8900
- 9000:9000
# 由于myserver中需要使用到上述的redis和mysql服务,此处设置一个先后顺序
depends_on:
- redis
- mysql
# 由于需要执行dmidecode命令,但是容器中不能执行,需要依赖宿主机的部分文件,此处将宿主机中的/sbin/dmidecode, /dev/mem挂载到容器中;将服务中的配置文件进行挂载
volumes:
- "/sbin/dmidecode:/sbin/dmidecode"
- "/dev/mem:/dev/mem"
- "./myserverfile/application.properties:/opt/myserver-0.0.1-SNAPSHOT/conf/config/application.properties"
- "./myserverfile/application-prod.properties:/opt/myserver-0.0.1-SNAPSHOT/conf/config/application-prod.properties"
- "./myserverfile/myserver-0.0.1-SNAPSHOT.jar:/opt/myserver-0.0.1-SNAPSHOT/lib/myserver-0.0.1-SNAPSHOT.jar"
# 给容器中root权限,执行dmidecode命令需要root权限
privileged: true
# 设置启动脚本, 由于启动过程中需要使用mysql,若连接不是数据库,则会导致服务启动失败,此处进行一个延时处理,并且最后执行的命令需要维持容器不退出,此处使用tail 日志,并且最后能使用docker logs查看日志;
command: >
/bin/bash -c 'sleep 30; /opt/myserver-0.0.1-SNAPSHOT/bin/restart.sh;tail -f /myserver-file/log/web.log '
三、docker安装elasticsearch
docker pull elasticsearch:8.5.0
- 启动:
docker run -d -p 9203:9200 -p 9303:9300 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -v /root/dockers/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:8.5.0
;使用自己的配置文件/root/dockers/elasticsearch.yml
,挂载在容器中 - elasticsearch.yml的内容:
cluster.name: "docker-cluster-01"
network.host: 0.0.0.0
# 此处开启xpack,默认为true,查询的资料是为了设置密码,改了密码后,需要使用https访问,将此处改为false,后续使用http访问
xpack.security.enabled: false
# 关闭geoip数据库的更新
ingest.geoip.downloader.enabled: false
xpack.security.enrollment.enabled: true
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
# 在默认配置上添加
http.host: 0.0.0.0
transport.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
- 安装中的问题:
在8.5.0版本中默认配置xpack.security.enabled: true; ingest.geoip.downloader.enabled: true
, 想在启用容器时使用自己的配置文件,将这两个配置修改为false,但是挂载失败,最后在docker-compose中添加环境变量
environment:
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
- "discovery.type=single-node"
- "ingest.geoip.downloader.enabled=false"
- "xpack.security.enabled=false"
最终在结合springboot使用时,发现版本不兼容,es版本过高,则改为7.11.2版本,发现在7x版本中,默认配置只有
cluster.name: "docker-cluster"
network.host: 0.0.0.0
,所以此时配置满足需求,不进行追加额外的配置
四、docker安装mino
docker pull minio/minio
,获取到的版本为 RELEASE.2022-01-04T07-41-07Z- 使用docker-compose启动,yml文件内容为(参考:
https://www.cnblogs.com/jetsung/p/minio-oss.html
):
version: '3.7'
services:
server:
image: minio/minio:latest
command: server --console-address ":9101" /data
environment:
# 设置账号密码,对长度有要求: 用户名长度至少3位, 密码长度至少8位
MINIO_ROOT_USER: 用户名
MINIO_ROOT_PASSWORD: 密码
# 为 Console 管理平台登录网址,若不希望通过浏览器登录,可以增加 MINIO_BROWSER: off,禁止浏览器登录;
MINIO_BROWSER_REDIRECT_URL: http://loaclhost:9101
# 为文件分享网址。若未设置,则默认为本身的容器 IP,不可正常使用
MINIO_SERVER_URL: http://loaclhost:9100
healthcheck:
test: ["CMD", "curl", "-f", "http://10.26.80.146:9100/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
volumes:
- /files:/data
ports:
- "9100:9000"
- "9101:9101"
由于9000端口已被使用,将minio的启动端口映射为9100。