基本概念
docker的连个基本概念:镜像、容器。
docker镜像可以理解为是存储docker安装包的地方,比如:mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。
可以通过docker pull命令拉取远程镜像到本地。比如:
docker pull mysql:latest
命令docker images可以查看到拉取到本地的docker镜像:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 2 months ago 187MB
redis latest 170a1e90f843 3 months ago 138MB
mcr.microsoft.com/mssql/server 2017-latest 19d34f261156 8 months ago 1.33GB
openjdk 8 b273004037cc 21 months ago 526MB
[root@localhost ~]#
容器是镜像安装后的实例,比如通过sqlserver镜像可以在docker容器运行mysql:
docker run -p 3306:3306 --name mysql --restart=always --privileged=true \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
之后可以通过命令检查docker ps检查docker实例:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e42b51b7bd90 redis "docker-entrypoint.s…" 3 weeks ago Up 3 weeks 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
960a53760612 minio/minio "/usr/bin/docker-ent…" 5 weeks ago Up 4 weeks 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp, 0.0.0.0:9002->9000/tcp, :::9002->9000/tcp minio
11bf3386b072 mcr.microsoft.com/mssql/server:2017-latest "/opt/mssql/bin/nonr…" 5 weeks ago Up 4 weeks 0.0.0.0:135->135/tcp, :::135->135/tcp, 0.0.0.0:1433->1433/tcp, :::1433->1433/tcp, 0.0.0.0:51000->51000/tcp, :::51000->51000/tcp sqlserver2017
docker-compose.yml
通过docker run命令运行docker容器需要指定容器运行参数,因此docker run命令参数繁多,比较繁琐。
docker-compose.yml文件可以很好的解决每次通过docker run命令运行容器需要记住n多参数的繁琐。可以将容器运行时的参数都编排到docker-compose.yml、以及Dockerfile文件中,运行容器的命令就会变的非常简单:
# 运行容器
docker start [容器id或容器名称]
docker stop [容器id或容器名称]
docker restart [容器id或容器名称]
比如:
version: '3'
services:
#服务名称
mssql:
#容器名称
container_name: sqlserver2017
#镜像名称
image: mcr.microsoft.com/mssql/server:2017-latest
#总是重启后启动
restart: always
#端口映射
ports:
- 11433:1433
- 135:135
- 51000:51000
#挂载
volumes:
- "/home/docker/sqlserver2017:/var/opt/mssql"
- "/etc/localtime:/etc/localtime"
#环境变量
environment:
- TZ=Asia/Shanghai
#接受最终用户许可协议
- ACCEPT_EULA=Y
- MSSQL_RPC_PORT=135
- MSSQL_DTC_TCP_PORT=51000
#SA用户密码
- SA_PASSWORD=password@kdf
也可以启动自己的springboot应用:
myApplication:
build:
context: ./springbootApp
dockerfile: Dockerfile
restart: always
container_name: myApplication
ports:
- 9801:9801
logging:
options:
max-size: 10mb
在当前路径下需要存在springbootApp目录,该目录下包含指定的Dockerfile文件:
FROM openjdk:8
#
MAINTAINER zhangfu<zhangfu@gmail.com>
# ʱ
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
VOLUME /tmp
RUN mkdir -p /my-app
WORKDIR /my-app
EXPOSE 9801
# 指定jar文件
ADD jeecg-boot.jar jeecg-boot.jar
ENV PARAMS=""
ENTRYPOINT ["java","-jar"," jeecg-boot.jar"]
之后,就可以在docker-compose.yml文件所在的目录启动应用:
docker start myApplication
所以可以理解为:有两种方式启动docker实例,一种是通过docker镜像,一种是通过build的方式:利用context指定路径下的dockfile文件启动容器。
容器服务端口
容器实例化的过程中会指定两个端口:
宿主机端口:容器内服务端口。
宿主机端口是我们访问服务的端口,因为我们肯定是通过宿主机访问容器服务的,所以启动多个服务的时候需要注意宿主机端口冲突。
容器内服务端口是容器内启动的服务的端口,这个时候需要特别注意的是我们启动在容器内的服务的端口,往往是通过配置文件指定的,一定要和我们启动容器的compose命令(或者通过docker run)指定的端口一致。
比如我们要通过容器启动redis服务,一般来讲是在confi文件中指定redis服务的端口号,比如在docker-compose.yml文件中:
redis:
image: redis
restart: always
hostname: redis
container_name: redis
privileged: true
ports:
- 6379:6379
environment:
TZ: Asia/Shanghai
volumes:
- ./redis/data:/data
- ./redis/conf/redis.conf:/etc/redis/redis.conf
- ./redis/logs:/logs
command: ["redis-server","/etc/redis/redis.conf"]
其中:
ports:
- 6379:6379
中前面的6379是宿主机的端口,后面一个6379是容器内要启动的redis服务的端口号。后面的这个容器内redis服务的端口号,一定要和配置文件中:
指定的端口要一致!
也就是./redis/conf/redis.conf文件中指定的服务启动端口一定也是6379,否则,容器能成功启动,不会报错,但是服务无法访问。
build方式启动容器
一般来讲,通过镜像方式启动三方服务比如mysql、redis、sqlserver、nginx等,当前这类服务大多是支持docker的,可以很容器的找到对应的docker镜像。
我们自己的应用,可以通过build方式启动:
container-name:
build:
context: ./container-dir
dockerfile: mydockerfile
其中context指定启动容器的主目录,dockerfile指定启动容器的配置文件名,dockfile在一定要在context指定的路径下存在。
dcokfile最主要的作用就是从宿主机映射我们的应用到docker容器内、暴露docker容器的端口到宿主机、在容器内运行服务。
容器服务的启停
在docker-compose.yml文件的当前路径下,通过一下命令创建并启动容器:
docker-compose -f docker-compose.yml up -d --build container-name
创建并启动build方式的容器服务。
docker-compose -f docker-compose.yml up -d redis
创建并启动镜像方式的容器。
创建容器之后,可以通过一下命令启停:
docker start container-name;
docker stop container-name;
docker restart container-name;
配置文件发生变化的话,需要通过第一种方式、重新创建并启动容器,新的配置才能生效。
docker容器的log文件
可以通过docker logs命令查看docker容器内服务的日志。
# 跟踪docker容器的日志
docker logs --follow container-name
# 最近30分钟的容器日志
docker logs --since 30m container-name
# 2024-04-26之后的10条日志
docker logs --since '2024-04-26' --tail=10 feixun-mssql
进入docker容器内部
docker exec -it container-name /bin/bash
比如:
[root@localhost feixun-mssql]# docker exec -it redis /bin/bash
root@redis:/data# ls
dump.rdb
root@redis:/data# pwd
/data
root@redis:/data#