在docker的很多操作中,命令行输入的参数如镜像ID和操作容器ID等,都可以分别替换成镜像名和容器名。
# 搜索名为IMAGE_NAME的镜像
$ docker search IMAGE_NAME
# 拉取名为IMAGE_NAME的镜像
$ docker pull IMAGE_NAME
# 拉取版本为1.1.1的镜像
$ docker pull IMAGE_NAME:1.1.1
# 使用当前目录下(.)的Dockerfile文件创建名为IMAGE_NAME标签为IMAGE_TAG的镜像
$ docker build -t IMAGE_NAME:IMAGE_TAG .
# 基于已有容器创建镜像
$ docker commit -m "提交信息" -a "作者" CONTAINER_ID IMAGE_ID
$ docker images
不能移除容器中运行着的镜像
# 移除ID为IMAGE_ID镜像
$ docker rmi IMAGE_ID
# 移除所有镜像
$ docker rmi -f $(docker images -q)
# 将镜像IMAGE_ID重命名为IMAGE_NAME标签为IMAGE_TAG
$ docker tag IMAGE_ID IMAGE_NAME:IMAGE_TAG
假设容器ID为CONTAINER_ID
$ docker run [ --net host] [--name CONTAINER_NAME] -d [-p HOST_PORT:CONTAINER_PORT] IMAGE_ID
# 创建容器运行 IMAGE_ID 镜像,并执行 COMMAND 命令
# 此外可以使用-it 参数可以形成交互式的新窗口
$ docker run IMAGE_ID COMMAND
# 举个例子
$ docker run java /bin/echo "hello world"
$ docker ps
格式化输出 $ docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Status}}"
# 进入容器中的命令行,最常用的命令,使用组合键 Ctrl+P+Q 即可退出容器
$ docker exec -it CONTAINER_ID /bin/bash
使用 attach 命令可能发生窗口堵塞
$ docker attach CONTAINER_ID
容器中安装 SSH Server,此方法合本就需要 SSH 环境的容器
使用nsenter1此方法需安装util-linux
# 使用以下命令可以获取到容器进程为 CONTAINER_PID
$ docker inspect -f {{.State.Pid}} CONTAINER_ID
# 使用 nsenter 进入容器
$ nsenter --target CONTAINER_PID --mount --uts --ipc --net --pid
# 运行已经停止的容器
$ docker start CONTAINER_ID
# 重启正在运行的容器
$ docker restart CONTAINER_ID
# 停止正在运行的容器
$ docker stop CONTAINER_ID
# 强制停止容器
$ docker kill CONTAINER_ID
# 移除某一容器
$ docker rm CONTAINER_ID
# 移除所有容器
$ docker rm -f $(docker ps -a -q)
# 重命名为 CONTAINER_NAME
$ docker rename CONTAINER_ID CONTAINER_NAME
# 查看最后 200 行日志
$ docker logs -f --tail 200 CONTAINER_ID
网络类型 bridge(与宿主机桥接,自动分配ip)[默认], host(附属于主机,同宿主机ip), none(无指定网络,不分配ip)
$ docker run -it --net host ubuntu /bin/bash
# 使用地址段192.168.0.0/16
$ docker network create --subnet=192.168.0.0/16 mynet
# 使用固定ip
$ docker run -it --net mynet --ip 192.168.0.10 ubuntu /bin/bash
# 运行一个 nginx 镜像,并挂载卷 /usr/share/nginx/html
$ docker run -d -p 80:80 --name nginx -v /usr/share/nginx/html nginx
# 检查容器信息
$ docker inspect nginx
# 所列的信息中 "Mounts" : [ { "Source" : 宿主机挂载位置 } ]
# Linux 下改位置为真实位置
# Windows 和 Mac 下该位置处于虚拟机上,需要登陆虚拟机在查看该位置
$ ls
# 将宿主机的目录挂载到容器
$ docker run -p 80:80 -d -v HOST_DIR:CONTTAINER_DIR nginx
# 创建数据存储的独立容器
$ docker create -v HOST_DIR:CONTAINER_DIR --name DATA_CONTAINER_NAME
# 将创建的数据容器挂载到其它容器中,实现多容器数据共享
$ docker run --volumes-from DATA_CONTAINER_NAME IMAGE_NAME
# 登陆官方仓库 Docker Hub,输入登陆名和密码
$ docker login
# 上传镜像
$ docker push YOUR_IMAGE
# 使用 /opt/data/registry 目录存放镜像
# 使用证书(生成后保存在 /home/certs 目录下,Docker_crt 和 Docker_key)
$ docker run -d -p 5000:5000 --restart=always --name registry \
> -v /opt/data/registry:/var/lib/registry \
> -v /home/certs:/certs \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/Docker_crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/Docker_key \
> registry:2
# 登陆私有仓库
$ docker login REPOSITORY_URL
$ docker push IMAGE_ID
打开浏览器访问 “http://REPOSITORY_URL/v2/_catalog”
docker 客户端默认采用 https 方式连接,直接使用客户端连接http镜像仓库推送镜像时会报错
"server gave HTTP response to HTTPS client"
登陆docker宿主机2,在 /etc/docker/ 下创建 daemon.json ,并添加
{"insecure-registries":["192.168.1.10:5000"] }
其中 192.168.1.10:5000
为私建镜像仓库地址,然后重启 docker .
① 修改docker的配置文件(各种版本修改方法,视版本和目录情况而定)
$ vi /etc/sysconfig/docker
# 添加下面一行
DOCKER_OPTS="--insecure-registry xxx.xxx.xxx.xxx:5000"
② 在 /etc/docker/ 下创建 daemon.json ,并添加
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["http://registry.yuan.com:5000"]
}
其中 registry.yuan.com:5000
为私建镜像仓库地址
然后重启docker后台进程,
$ sudo service docker restart
或
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
创建仓库时需要创建证书,否则使用一些命令时会报错.
$ docker search 192.16831.10:5000/veoer/account
"If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.1.10:5000` to the daemon's arguments.
In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.1.10:5000/ca.crt"
在 windows 或 mac 下安装 docker 时使用 docker toolbox 工具,安装完成后使用 Xshell 连接docker虚拟机
① 查看主机映射端口:virsual box 中虚拟机网络设置 ,网卡1地址转换,网卡2仅主机网络,查看网卡1地址转换高级设置端口转发
名称 | 协议 | 主机IP | 主机端口 | 子系统IP | 子系统端口 |
---|---|---|---|---|---|
ssh | TCP | 127.0.0.1 | 49648 | 22 |
② 查看到虚拟机映射到主机的端口为 49648,则Xshell登陆时连接为 127.0.0.1:49648
用户名 | 密码 | 说明 |
---|---|---|
docker | tcuser | Xshell登陆验证 |
root | 无法登陆,通过docker用户sudo -i 进行切换 |
并报错 the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
,解决办法如下:
① 在命令前面加上 winpty
$ winpty docker exec -it ubuntu /bin/bash
② 进入虚拟机执行命令
使用命令 docker-machine ssh default
即可进入虚拟机
nsenter在util-linux中,使用nsenter须安装util-linux: yum install util-linux
↩︎
非linux环境docker安装在虚拟机上,登陆虚拟机可以直接从virsual box等软件登陆,也可通过Xshell登陆虚拟机具体见: 附Ⅰ.Xshell登陆docker虚拟机 ↩︎