Docker 常用操作
运行
docker run
--name 指定容器名
-p 指定端口映射
-v 挂载数据卷或者本地目录映射 :ro 挂载为只读
-d 后台持续运行
-i 交互式操作
-t 终端
-rm 容器退出后随之将其删除(与-d 冲突)
eg:
docker run --name localregistry -d -v /disk2/dockrepo:/var/lib/registry -p 5000:5000 registry
docker run -it --rm ubuntu:14.04 bash
sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
docker run --name webserver -d -p 80:80 nginx
管理容器
docker ps
列出正在运行的容器docker kill $(docker ps -q)
停止所有正在运行的容器docker ps -a
查看停止状态的容器docker start
启动一个已有容器docker stop
终止一个运行中的容器docker restart
重启某个容器docker rm xxxx
删除容器-f
删除运行中的docker rm $(docker ps -a -q)
删除所有终止的容器docker logs [container id or names]
获取输出logdocker diff
容器名 查看我们定制以及修改docker volume ls
列出所有本机的数据卷
管理镜像
docker pull [option] [url]
获取镜像- eg:
docker pull ubuntu:14.04
- eg:
docker images
列出本地镜像docker build -t nginx:v3 .
在当前目录构建镜像,-t 是指定 镜像名称 tagdocker rmi xxxxxx
删除本地镜像docker commit 选项 容器名/id 仓库名 tag
可以把修改定制过的容器保存为镜像docker images -f dangling=true
列出所有虚悬镜像(dangling image)docker rmi $(docker images -q -f dangling=true)
删除所有虚悬镜像docker histroy 镜像名:标签
查看镜像修改的历史纪录
Dockerfile
- COPY 原路径 目标路径
- ADD 性质基本与COPY类似,但支持自动解压
- VOLUME 可以定义匿名卷,执行时可被覆盖
- EXPOSE 声明端口
- WORKDIR 指定工作目录
- USER 指定当前用户
- HEALTHCHECK 健康检查
- ONBUILD 被作为基础镜像时才执行
docker-compose
-p
指定项目名称build
构建项目中的服务容器--force-rm
删除构建过程中的临时容器--no-cache
构建过程中不使用 cache--pull
始终通过pull
来获取更新版本的镜像docker-compose kill
强制停止服务容器docker-compose logs
查看容器的输出 调试必备docker-compose pause
暂停一个服务容器docker-compose unpause
恢复暂停docker-compose port
打印某个容器端口所映射的公共端口docker-compose ps
列出项目中目前的所有容器 -q 只打印容器 iddocker-compose pull
拉取服务依赖的镜像docker-compose restart -t
指定重启前停止容器的超时默认10秒docker-compose rm
删除所有停止状态的容器先执行 stopdocker-compose run
指定服务上执行一个命令docker-compose start
启动已经存在的服务容器docker-compose stop
docker-compose up
自动构建、创建服务、启动服务,关联一系列,运行在前台,ctrl c
就都停止运行。如果容器已经存在,将会尝试停止容器,重新创建。--no-recreate
不希望重新创建,就只启动处于停止状态的容器,docker-compose up --no-deps -d
只想重新部署某个服务,不影响其所依赖的服务docker-compose up -d
后台启动运行,生产环境必备
Tips
容器在运行时,以镜像为基础层,在其上创建一个当前容器的存储层,使用 go 语言开发的应用更多的会使用 FROM scratch
来做空白镜像为基础
Dockerfile 中,RUN 执行命令,直接写需要在bash中执行的命令。如果每条命令都作为一个 RUN 单独存在,就相当于每个指令都建立一层,很多不需要的东西都被装进了镜像里,比如编译环境,更新的软件包等等,最终会产生出非常臃肿,非常多层的镜像,增加了构建部署的时间。也很容易出错。正确的写法是把每一大块,或者说每一个软件环境的相关命令集成在一个 RUN 里。
进入退出 Docker容器
启动了Docker容器,比如
docker run -itd -p 3000:3000 --name my-web -v "$(pwd)":/webapp -w /webapp node npm start
如何看到终端打印的报错和日志呢?
docker有命令可以让你进入(attach)和退出(detach)该进程。
进入:
docker attach my-web
退出,一定不要用ctrl+c,那样就是让docker容器停止了。
要用如下快捷键:
- 先按,ctrl+p
- 再按,ctrl+q
add user to docker group
sudo groupadd docker
sudo gpasswd -a ${USER} docker
代理设置
该方法是持久化的,修改后会一直生效。该方法覆盖了默认的docker.service文件。
- 为docker服务创建一个内嵌的systemd目录
mkdir -p /etc/systemd/system/docker.service.d
- 创建
/etc/systemd/system/docker.service.d/http-proxy.conf
文件,并添加HTTP_PROXY
环境变量。其中[proxy-addr]
和[proxy-port]
分别改成实际情况的代理地址和端口:[Service] Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
- 如果还有内部的不需要使用代理来访问的Docker registries,那么需要制定
NO_PROXY
环境变量:[Service] Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
- 更新配置:
systemctl daemon-reload
- 重启Docker服务:
systemctl restart docker