目录

  • docker基本命令介绍
  • Dockerfile介绍
  • 扩展


docker基本命令介绍

首先我们需要安装docker,安装过程不做介绍,然后我们可以在docker hub官网查询我们需要的镜像,然后docker pull拉取我们需要的镜像

查询镜像:docker search imageName
拉取镜像:docker pull imageName
启动容器:docker run imageName:tag
停止容器:docker stop 容器id
删除镜像:docker rmi 镜像id
删除容器:docker rm 容器id
查询所有镜像:docker images
查询所有容器:docker ps -a
进入容器:docker exec -it 容器id /bin/bash
查看日志:docker logs 容器id -f(-f表示新的日志会继续刷新)
查看最后多少行日志:docker logs -tail 200 容器id(-f表示新的日志会继续刷新)
查看容器当前属性:docker inspect 容器id
挂载到宿主机目录:-v 本地目录:容器内目录(相当于启动时把宿主机的目录拷贝到容器相应目录,会覆盖容器内的目录,并且建立容器内目录和宿主机目录的关联)
端口映射:-p 外部端口:容器内端口
后台运行 -d
环境变量:-e 如:-e JAVA_OPTS="-Denv=dev -Dapollo.meta=http://apollo.dev.cn/"
宿主机拷贝到容器内(容器拷贝到宿主机就反过来):docker cp 宿主机目录文件 容器id:容器内目录,如docker cp /usr/local/test 818181:/usr/local/dir

案例:
拉取一个mysql镜像,并且启动镜像挂载存储目录到宿主机(避免重启容器后丢失数据,一般需要存储数据的镜像都需要挂载目录)

docker pull docker.io/mysql:5.7.29
docker run -p 3500:3306 --name mymysql -v /share/mysql/data:/var/lib/mysql -v 
/share/mysql/logs:/var/log -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql:5.7.29

1、拉取mysql:5.7.29镜像
2、根据镜像mysql:5.7.29创建容器名字为mymysql
3、容器内3306端口映射到外部端口3500
4、把容器内日志文件夹挂载到宿主机/share/mysql/logs
5、把容器内存储目录挂载到宿主机/share/mysql/data
6、设置环境变量,MYSQL_ROOT_PASSWORD=123456
7、后台运行

除了官方提供的镜像我们还可以使用Dockerfile自己制作镜像

Dockerfile介绍

Dockerfile:用于执行docker指令生成镜像
构建镜像:docker build xxx (docker build -f /path/to/a/Dockerfile -t myimage:1.0 . (-f:表示指定dockerfile所在目录,注意最后需要加个点。-t:指定生成的镜像名称和tag))

Dockerfile文件命令:
首先我们创建一个Dockerfile文件,然后在里面即可填写命令
from:指定基础镜像(必须是第一行:from mysql(基础镜像的底层一般都是由一个简易的linux系统作为底层的))
MAINTAINER:维护者信息(MAINTAINER my)
ENV:环境变量(ENV MY_PATH /usr/local/gcp,后续其他命令可以使用)
RUN:执行命令(创建一个文件夹:run mkdir /usr/xxx)
ADD:本地文件加载到容器中(把本地文件添加到容器里面的某个目录:add target/user.jar /usr/xxx/user.jar)
COPY:拷贝本地文件到容器中(拷贝target目录下所有文件到容器/usr/target目录:copy target /usr/target,和add类似,使用时如果拷贝文件夹则只会拷贝文件夹中的内容)
CMD:相当于启动docker时候后面添加的参数(CMD ["/bin/bash","-c"])
ENTRYPOINT:容器启动时执行(启动某个java进程,并设置环境变量:java -jar -Denv=fat -Dapollo.meta=http://apollo.fat.cn/ /usr/demo/test.jar )
WORKDIR:为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录(WORKDIR /data)
EXPOSE:暴露接口端口(注意这里并不起作用,只不过相当于注释,实际还是要启动容器时指定)

Dockerfile案例:

以下DockerFile即可把springboot打包的jar制作成我们需要的docker镜像

FROM  adoptopenjdk/openjdk8
MAINTAINER myname
RUN mkdir /usr/demo
ADD test.jar /usr/demo/test.jar
EXPOSE 7601
ENTRYPOINT java -jar /usr/demo/test.jar

Dockerfile所在目录执行docker build -t myimage:1.0 .

1、基础镜像openjdk8
2、作者信息myname
3、创建一个目录/usr/demo
4、把启动文件jar放到/usr/demo目录
5、注释暴露的端口7601
6、启动命令,加了个环境变量

扩展

1、Dockerfile内容可以写环境变量
ENTRYPOINT java $JAVA_OPTS -jar /usr/demo/test.jar
容器启动时指定环境变量$JAVA_OPTS,如-e JAVA_OPTS="-Denv=fat -Dapollo.meta=http://apollo.fat.cn/",即可把JAVA_OPTS替换到ENTRYPOINT中执行

2、ENTRYPOINT和CMD的区别

  • ENTRYPOINT:可以指定容器启动时指定的命令和参数,必定执行,命令和参数都不可被替换
  • CMD:也可以指定容器启动时指定的命令和参数,参数可以被docker run启动时最后的参数替换
    ENTRYPOINT和CMD应该只需要一条是携带命令的,如java -jar。
    CMD写的参数可以添加到ENTRYPOINT后面
    docker run最后加的命令行参数可以替换CMD的参数
    所以合理的使用应该是:ENTRYPOINT指定要执行的命令如java -jar,CMD 可为 ENTRYPOINT 提供额外的默认参数,docker run 命令行可替换CMD的默认参数

3、下载官方的镜像时可能会很慢,因为服务器在国外,可以设置为国内镜像

  • linux服务器执行:vi /etc/docker/daemon.json
  • 然后填写内容:{“registry-mirrors”: [“https://3laho3y3.mirror.aliyuncs.com”]} 保存
  • 重启docker引擎:systemctl restart docker.service
  • 再次执行docker pull即可使用国内服务器下载