docker
常用命令
docker run -d -p 8100:8100 --name custome_name -it IMAGE_NAME
-d
后台 -i
让容器的标准输入保持打开 -t
让docker分配一个伪终端并绑定到容器的标准输入上 -e
username="ritchie" 设置环境变量;
-i
打开了输入,-t
模拟一个终端如果没有后台运行,在不使用-t参数的情况下,会因为没有终端而无法退出输出界面。因此如果不需要交互输入而且又没有-d参数置于后台,那么应该加上-t参数分配一个终端用于执行ctrl+c命令退出
docker run --rm image_name [cmd]
--rm 参数会在容器退出时自动删除容器以及产生volume,一般在测试的时候会用
docker start CONTAINER_ID
启动容器,使用-i
参数可以打开标准输入
docker exec -it CONTAINER_ID /bin/bash
进入容器 docker logs --details -f CONTAINER_ID
查看日志
docker run -d -p 8100:8100 -v /root/workspace/projects/scriptbot-8100/docker_scriptbot.log:/scriptbot.log -v /root/workspace/projects/scriptbot-8100/scriptbot.jar:/scriptbot.jar --name scriptbot java:8 java -jar /scriptbot.jar --spring.profiles.active=demo --server.port=8100 --logging.file=/scriptbot.log
通过挂载文件的方式启动
Docker Volume docker run --name container-test -v /data debian /bin/bash
:将/data
挂在到容器中,文件可以在主机直接操作,docker inspect -f {{.Volumes}} container-test
可以看到该volume在主机上的存储位置。dockerfile文件中的VOLUME /data
是一样的效果。 docker run -v /home/adrian/data:/data debian ls /data
:这种方式使用-v
可以明确指定将主机的目录/home/adrian/data
挂载到容器内的/data
上
docker run -it --entrypoint="/bin/bash" image:tag
使用--entrypoint覆盖入口
离线安装镜像
docker的技巧
用docker来做linux应用程序,docker run --rm 的应用
在linux系统中可以借助docker镜像来做程序,而不需要真的去安装程序。
以安装redis客户端为例
编写一个如上的shell脚本redis-cli
。
--rm
参数类似于playground模式,让容器在停止之后自动删除,保持干净。 $*
的意思是接收执行shell脚本时的所有参数。
然后把该脚本连接到/usr/local/bin
目录ln -s /home/dev/redis-cli /usr/local/bin/redis-cli
,当然也可以直接在这个目录编写该脚本也一样。
授权chmod +x /usr/local/bin/redis-cli
这样就完成了,只要在终端输入redis-cli 就可以了
docker理解
(转)Docker镜像中的base镜像理解 - 笑侃码农 - 博客园
深入学习
docker 容器权限
在没有开启privileged
配置的默认情况下,docker容器内的root用户只是外部的一个普通用户权限,很多操作是不允许的,比如启动服务,比如在容器中再次启动一个docker服务。 因此docker run --privileged=true
启动特权设置将允许你在容器内进行root操作。
CMD 与 ENTRYPOINT
在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准。 在Dockerfile中,只能有一个CMD指令,如果有多个CMD指令则以最后一个为准。 在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一。 任何docker run设置的命令参数或CMD指令的命令,都将作为ENTRYPOINT指令的命令参数,追加到ENTRYPOINT指令的命令之后。 如果没有ENTRYPOINT指令而是使用CMD作为启动命令,那么docker run设置的命令参数会覆盖CMD指令。
容器间的通讯
使用 --link 或者使用network docker network基础 - wadeson - 博客园
Docker volume
理解Docker(8):Docker 存储之卷(Volume) - SammyLiu - 博客园 Docker容器学习梳理--Volume数据卷使用 - 散尽浮华 - 博客园
关于文件覆盖 Docker数据持久之volume和bind mount - CSDN博客
是什么
在不使用数据卷轴的情况下,docker容器内的数据只存在于其生命周期内,且容器外部以及其他容器都无法访问,容器一旦删除数据也丢失了(除非commit一个新的镜像),因此会有散需求需要满足: 一是 容器之间共享数据,二是容器内数据的持久化,三是容器共享宿主机数据。为了解决这三个问题所以有了数据卷轴的概念,在下文的使用中的使用卷轴中会说明如何解决这两个问题。
使用
有两种使用方式,一个是docker run命令的-v
参数,一个是dockerfile文件中的VOLUME
E命令
>
挂载卷轴
-v 方式挂载
-v [host-dir]:container-dir:[rw|wo]
如果指定host-dir
,那么就会挂载指定的目录到容器中的目录上,并且会覆盖容器中指定目录的内容。 如果不指定host-dir
,那么会在系统的/var/lib/docker/volumes
目录下生成一个目录挂载到容器内。 可以通过docker inspect container-id
来查看挂载情况
VOLUME方式挂载
在编写dockerfile文件时可以通过VOLUME dir
的方式去挂载一个卷轴,这种方式与使用-v但是不指定host-dir
是相同的
删除卷轴
Volume只有在下列情况下才能被自动删除:
该容器是用
docker rm -v
命令来删除的(-v是必不可少的)。docker run中使用了
--rm
参数
即使用以上两种命令,也只能删除没有容器连接的Volume。连接到用户指定主机目录的Volume永远不会被docker删除。即通过-v host-dir:container-dir
明确指定主机目录的情况下,是不会删除主机上的文件的 如果你没有使用上面两种方式去删除卷轴,那么通过docker volume COMMAND
将可以删除僵尸卷轴
docker volume rm VOLUME [VOLUME...]
删除指定的卷轴 docker volume prune
清理所有不使用的卷轴
正如前面所说使用-v host-dir:container-dir
指定的卷轴不会被删除,而且也不会出现在volume卷轴管理中,即通过docker volume ls
命令是看不到这种方式创造的卷轴的
docker volume命令是在后来的版本中引入的新功能,它除了可以管理所有的卷轴外(除了明确指定主机目录的卷轴),还可以独立的去创建一个卷轴,这样可以方便的在多个容器之间共享卷轴
使用卷轴
卷轴的目的是为了解决前文提出的三个问题,那么我们这里一一说明
数据持久化以及共享宿主机数据场景
我们通过-v host-dir:container-dir
的方式将主机上的一个目录映射到容器内,这样对container-dir目录的所有操作就是对主机host-dir目录的操作,容器删除后该目录的数据仍然存在。 这样便解决了数据持久化问题,以及宿主机和容器共享数据问题。
容器之间共享数据场景
docker run命令中可以通过--volumes-from
参数来共享其他容器或卷轴的数据
一种方式是 docker run --volumes-from container-id
指定一个容器可以共享该容器中创建的卷轴,这里只是共享指定容器中创建的数据卷轴而不是共享容器的数据(目标容器运行与否无关).
还有一种更优雅的方式则是通过docker volume
命令
⚠️通过docker volime
命令创建的卷轴在删除容器时即使加了-v
参数(docker rm -v container-id
)也不会删除卷轴
docker Compose
常用命令
Compose 命令说明 - Docker —— 从入门到实践 - 极客学院Wiki Docker Compose 配置文件详解 Docker-Compose入门 - CSDN博客 docker-compose ports和expose的区别 - 歪麦博客
在一个docker-compose中的容器,会被自动放在一个网络环境里,不用再使用 --link 去连接容器了,可以直接通过容器的名称(container_name
)或者service的名称来访问其他容器。使用docker network ls
命令可以看到会自动创建一个桥接网络,在第一次运行compose时也可以看到提示创建了网络。
参考配置:
dockerfile 的多阶段构建 (多个from)
示例
参考
Docker折腾记: (1)构建yapi容器,从构建发布到可用 - 掘金
CentOS7 Tomcat 启动过程很慢,JVM上的随机数与熵池策略
Docker network第五讲-替代“--link”(Docker系列)
Last updated