最近准备组内分享,因为之前没接触过docker,所以准备学习一下,进行分享,过程中遇到很多问题,没能及时写下来,才想起来做个总结.
基本命令:

  1. 创建并启动容器:docker run [–name container_name ] [-itd] [-P(p] image_name [command]
    通常情况下都要使用-it 或者-d参数
    -it表示容器启动后会进入一个虚拟交互窗口 ,
    -d表示后台运行 ,
    -P表示随机映射端口
    -p表示手动指定端口
    –network 指定使用的网络
    –ip 指定使用的网络,(需要自定义网络,同时自定义subnet ,格式如 172.20.0.0/16 )
    command 一般为 /bin/bash

2. 查看容器: docker ps [-a , -f, -q] 不加参数表示只看正在运行的,-f表示filter, -a查看全部, -q只看digest 可以有骚操作如 docker rm $( docker ps -aq) 表示删除全部的容器 3. 查看容器详细信息 docker inspect container_id 可以在后面使用 如 grep IPAddress 查看ip地址 4. 容器启动和停止: docker start | stop container_id start 表示启动停止的容器 5. 创建网络docker network create --subnet 172.20.0.0/16 -d bridge my-net1 6. 创建volume: docker create volume my-vol, 创建后保存在 /var/lib/docker/volumes 7. 查看 docker network/volume inspect id 8. commit 提交镜像: 使用docker commit 命令可以提交一个容器,生成一个镜像,但是不建议这样做,一方面会导致镜像文件比较大,另一方面,创建镜像的过程对于非创建者的其他人来说是黑箱操作,不利于后期的维护等 9. docker build: 使用docker build 命令创建镜像, 默认为当前目录的dockerfile文件,可以使用-f 指定文件名或目录 一般都会新建一个项目文件夹,在文件夹内操作, 参数也可以是一个url或者一个tar文件 常用命令如 RUN ,表示执行一条命令,可以使用&&连接多个RUN命令,每个RUN命令都会生成一层,因此可以尽可能减少层数 COPY 从主机拷贝到容器,需要指定上下文,否则可能找不到文件 VOLUME 表示匿名卷,docker run的时候,或者不明显直接指定,都会使用匿名卷,好处是不会丢失修改,但是要注意,匿名卷映射的位置需要是文件在容器内保存的位置,如nginx的html文件,保存在 /var/share/nginx/html ,就需要映射此目录,否则指定匿名卷没用,非匿名卷也一样,位置要对 CMD: 表示容器运行时执行的命令,RUN一般用于创建过程执行的命令 ENTRYPOINT :指定入口点,和CMD差不多,区别在于,可以在run的时候指定或修改默认命令的参数, RUN CMD ENTRYPOINT 都可以使用 SHELL 或 EXEC 格式的命令,但最终还是EXEC格式的命令,如 shell格式 echo "hello world"执行的实际是 ["sh", "-c", "echo", "hello world"], 容器内不区分前后台,所有后台执行的命令都需要在前台执行,否则会相当于执行的前台命令是sh ,在执行完后,容器就会退出,如,运行nginx 不能用 systemctl start nginx 需要使用 ["/usr/sbin/nginx", ”-g", "deamon off;"] 10. docker export conatainer_id > filename.tar 将容器导出为镜像名称为filename.tar 11. docker import filename.tar repository:tag 将镜像导入为指定的仓库和标签

  1. docker-compose: 开发语言为python ,可以使用pip安装, 需要名为docker-compose.yml的文件来执行
    yml 格式的文件,使用两个空格缩进表示父子关系 , - 表示列表, ""双引号表示字符串

遇到纠结最久的问题:

  1. docker-compose run [service_name ],如果只是在docker-compose.yml指定端口映射的话, 端口并不能映射,需要使用 -p 参数指定才行, 而如果使用docker-compose up 则会使用docker-compose 里的配置
  2. docker-compose 和 dockerfile 制作django镜像,容器启动后自动执行命令 Python manage.py runserver 。完成后发现django程序在运行,端口也正常映射,但是就是不能在宿主机上访问, 以为是设置不对,改了dockerfile, docker-compose各种设置,都不行,最后把python manage.py runserver 命令改成 python manage.py runserver 0.0.0.0:8000 就可以了。
  3. volume 存储空间满了,数据库应用一开始正常使用,经过上面一番折腾之后,突然就不行了,总是不能正常运行,状态一直 exited. 使用docker logs db 发现有错误日志,错误28,看了以下详细信息是空间已满。于是找到了/var/lib/docker/volumes 这个文件夹,里面保存了很多临时卷,大小有几个G,使用命令 docker volume prune 清除没有使用的卷就好了