Docker的一些需记基础命令和用法
由于docker目前在项目中用的比较少,慢慢在写项目的过程中,有一些命令会被我遗忘掉。所以我把一些基础常用的docker命令列下来,方便自己在回顾docker或者重新使用的时候快速运用上。在后续的时间里,也会尽可能的将docker应用到能用上的项目中。
安装
我用linux比较多,所以只记录在linux下的安装步骤。
- 如果有旧版本的docker,需要先卸载旧版本。旧版本为docker或者docker-engine。
sudo apt-get remove docker docker-engine docker.io
- 用脚本安装。
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
- 启动docker
sudo systemctl enable docker
sudo systemctl start docker
- 建立docker用户组
sudo groupadd docker
sudo usermod -aG docker $USER
- 测试是否安装好
docker run --rm hello-world
常用命令
注意-t之类的命令是用于修饰动作的,比如run -t-d
镜像使用
- 拉取
docker pull ubuntu:18.04 # 拉取ubuntu镜像,对应版本(tag)为18.04
- 运行(这个镜像为基础启动并运行一个容器)
docker run -it ubuntu:18.04 bash # -ℹ交互式操作,-t终端
- 列出
docker image ls # ls后跟具名可以过滤该名的镜像; -a列出所有镜像
- 删除
docker image rm [IMAGE ID / 仓库名:标签] # id不需要全部打完,输入前3个就可以定位到
# 例如删除ubuntu
docker image rm ubuntu:18.04
容器使用
容器是独立运行的一个或一组应用,以及它们的运行态环境。
- 列出
docker container ls # ls只列出当前运行的容器,ls -a列出所有容器,包含了已经停止运行的
- 启动(这个镜像为基础启动并运行一个容器)
创建一个新的容器
docker run -it ubuntu:18.04 bash # -ℹ交互式操作,-t终端
启动一个已经停止的容器
docker container start [CONTAINER ID] # id不需要全部打完,输入前3个就可以定位到
- 守护态运行
docker run -it -d ubuntu:18.04 bash # -ℹ交互式操作,-t终端
如果需要查看守护态容器的日志信息,可以使用:
docker logs [CONTAINER ID] # id不需要全部打完,输入前3个就可以定位到
- 停止
docker container stop [CONTAINER ID]
# 如果需要重新启动,可以restart
docker container restart [CONTAINER ID]
- 进入容器
一般来说,都是需要一个可交互的终端进入容器
docker exec -it [CONTAINER ID] bash # exec进入容器,使用exit并不会停止容器的运行,这和attach不一样
- 删除
docker container rm [CONTAINER ID]
# 如果想清理所有停止运行的容器
docker container prune
Docker Hub
登陆和退出docker hub
docker login
docker logout
``
### 镜像的搜索
```bash
docker search ubuntu # 可以看到搜索出来的镜像
数据卷Volume
数据卷 可以在容器之间共享和重用 对 数据卷 的修改会立马生效 对 数据卷 的更新,不会影响镜像 数据卷 默认会一直存在,即使容器被删除
- 创建
docker volume create my-vol
- 查看
docker volume ls # 查看所有的数据卷
docker volume inspect [VOLUME NAME] # 查看某个数据卷的信息
- 启动
在使用docker run命令的时候,带上--mount
将数据卷挂载到容器中
docker run -d -P --name web --mount source=my-vol,target=/usr/share/nginx/html nginx:alpine # --name 定义容器的名称
以上命令。创建一个名为web
的容器,家在一个数据卷到容器web的/usr/share/nginx/html
目录。
查看数据卷的具体信息
docker inspect web
结果:
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
- 删除
docker volume rm [VOLUME NAME] # 删除指定的数据卷
docker volume prune # 删除无主的数据卷
- 挂载目录
$ docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html nginx:alpine
如果source为绝对路径,则为挂载主机的目录。
网络
外部访问容器
通过-P或-p参数指定或者不制定端口的方式让外部访问容器内部的网络应用。
docker run -d -P nginx:alpine # 启动一个容器
docker container ls
在PORTS那一列,可以看到:
0.0.0.0:32768->80/tcp
这里表示着本机的32768端口被映射到了容器的80端口,意味着在本机上访问32768端口就可以访问到容器的nginx默认页面。访问方式为本机ip + 端口(32768)。
容器互联
通过docker网络的方式让连接到创建的网络上实现容器之间的互联。
- 创建网络
docker network create -d bridge [NETWORK NAME]
运行第一个容器并连接到网络[NETWORK NAME]
docker run -it --rm --name busybox1 --network [NETWORK NAME] busybox sh
运行第一个容器并连接到网络[NETWORK NAME]
docker run -it --rm --name busybox2 --network [NETWORK NAME] busybox sh
以上两个容器连接到了同一个网络[NETWORK NAME],某一个容器都可以ping通与之连载在同一个网络下的容器。
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms