登录

docker login

镜像操作

从Docker仓库拉取镜像

docker pull [镜像]:[tag] //不使用tag则默认latest

把镜像上传到数据仓库

docker push [镜像]:[tag]

把容器提交成新的镜像

docker commit [容器名] [镜像名]:[tag]

镜像导出到文件

docker save -o [tar文件名] [镜像1]:[tag1] [镜像2]:[tag2]

镜像从文件导入

docker load < [tar文件名]

给镜像打新的tag

docker tag [源镜像名]:[源tag] [目标镜像名]:[目标tag]

删除镜像

docker rmi [镜像名]:[tag]

容器操作

启动、停止、重启、删除容器

docker start [容器名]
docker stop [容器名]
docker restart [容器名]
docker rm [容器名]

更改容器自动启动

docker update --restart=always [容器名]  //自动启动
docker update --restart=no [容器名]  //不自动启动

查看容器列表

docker container ls -a   //不加-a就只能看到运行中的容器

查看容器信息

docker inspect [容器名]

查看运行状态、统计信息

docker ps
docker stats

进入到容器的命令行(只对运行中的容器有效)

docker exec -it [容器名] [命令] //命令一般为 bash,但有的容器内部没有bash命令,就只能使用sh来代替

容器和宿主机之间的文件复制,对没有运行的容器也有效

docker cp [容器名]:[容器内路径] [宿主机路径]  //把文件复制到宿主机
docker cp [宿主机路径] [容器名]:[容器内路径]   //把文件从宿主机复制到容器

Docker run

docker run是最基本的利用镜像来运行容器的命令,有很多参数,在这里一一解释。

大多数参数在容器创建之后就没有办法修改了,少数比如restart这种参数可以通过update来修改,其他参数要删除容器,重新运行命令创建容器。

以下面这个命令举例

docker run -itd --name mongo --restart=always -v /home/docker/mongo/configdb:/data/configdb -v /home/docker/mongo/db:/data/db -p 27017:27017 mongo:4.2.3

最后一个参数是镜像名,意思是利用mongo:4.2.3镜像来创建容器。

-itd

经常一起使用,d的意思是在后台运行容器不占用当前命令行,it可以防止容器在运行完命令后退出。

--name

是指定容器名。

--restart

always是自动启动,no是不自动启动

-p

是端口映射,格式是[宿主机端口]:[容器端口],对宿主机相应端口的请求都会转发到容器的指定端口。

-v

是数据卷(Volume),可以有多重用法,最常用的方式是,直接让docker和宿主机共享宿主机上的文件或者文件夹,用法是[宿主机路径]:[容器内部路径],

每次启动容器的时候,都会用宿主机的路径覆盖掉容器内部路径。

一定要注意容器的数据卷定义,可以用docker inspect来查看mount里面的配置。

有的镜像定义了数据卷,但我们在run的时候又没有指定映射,Docker会为这个容器自动创建一个数据卷,可以用docker volume ls来查看。

容器提交的时候,数据卷内的内容并不会保存到镜像里去,容器删除的时候,数据卷也不会删除。用docker volume prune可以清除掉所有没有被使用的数据卷。

数据卷不能直接在文件系统里操作,因此建议还是使用文件夹映射的方式来管理持久化数据。

再看下面一个实例

docker run -d --name nurse1 -p 5571:5566 --add-host localnode:172.20.0.1 -v /home/docker/test/code:/opt/code -v/home/docker/test/log:/opt/log   MyTest/springboot:1.0

--add-host

因为容器的网络隔离机制,在容器内部访问127.0.0.1或者localhost都是指向容器本身,而不能指向宿主机,

如果想让容器来访问宿主机,就需要使用宿主机在docker0网桥上的ip,通常为172.x.0.1,可以通过ip add命令来查看。

这里--add-host给宿主机在容器里增加了一个hostname叫localnode,这样在容器内部使用localnode就可以访问宿主机了。

还有一种方式可以通过创建连接–link的方式来关联,但不推荐,因为关联的依赖性比较强,关联的容器没有启动的话,当前容器也无法启动。

下面这个实例

docker run -p 3316:3306 --name mysql -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/log:/var/log/mysql -v /home/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

-e

里面通过-e可以传入环境变量,在很多地方会使用到。

Docker-compose

一个个管理Docker命令太麻烦了,因此可以把所有的Docker命令放在一个结构化的文件里,使用docker-compose一键部署、重启和清除容器。

Docker-compose的文件有不同版本,最常用的是版本3,关于compose文件的所有格式和选项可以参考这里 链接

docker-compose默认使用当前文件夹下面的docker-compose.yml来运行。

常用命令

docker-compose up -d //部署所有容器
docker-compose down //清除所有容器

docker-compose.yml

这里举个docker-compose.yml的例子

比如下面这些docker命令,部署了mysql和mongo,访问这两个数据库的服务test1,还有一个nginx,负责处理和转发主机请求。

docker run -p 3316:3306 --name mysql --restart always -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/log:/var/log/mysql -v /home/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
 
docker run -itd --name mongo --restart always -v /home/docker/mongo/configdb:/data/configdb -v /home/docker/mongo/db:/data/db -p 27017:27017 mongo:4.2.3
 
docker run -d --name test1 --restart always -p 5571:5566 --add-host localnode:172.20.0.1 -v /home/docker/test1/code:/opt/code -v/home/docker/test1/log:/opt/log MyTest/springboot:1.0
 
docker run -d --add-host localnode:172.20.0.1 --name nginx --restart always -v /home/www:/home/www -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx -p 8071:8071 -p 8072:8072 -d nginx:1.17.8-alpine

整合成yml文件就是

version: '3'
services:
mysql:
image: "mysql:5.7"
container_name: "mysql"
ports:
- "3306:3306"
volumes:
- "/home/docker/mysql/data:/var/lib/mysql"
- "/home/docker/mysql/log:/var/log/mysql"
- "/home/docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
mongo:
image: "mongo:4.2.3"
container_name: "mongo"
ports:
- "27017:27017"
volumes:
- "/home/docker/mongo/configdb:/data/configdb"
- "/home/docker/mongo/db:/data/db"
restart: always
  test1:
image: "MyTest/springboot:1.0"
container_name: "test1"
ports:
- "5571:5566"
volumes:
- "/home/docker/test1/code:/opt/code"
- "/home/docker/test1/log:/opt/log"
restart: always
depends_on:
- mysql
- mongo  
extra_hosts:
- "localnode:172.20.0.1"
nginx:
image: "nginx:1.17.8-alpine"
container_name: "nginx"
ports:
- "8071:8071"
- "8072:8072"
volumes:
- "/home/www:/home/www"
- "/home/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "/home/nginx/logs:/var/log/nginx"
restart: always
depends_on:
- test1
extra_hosts:
- "localnode:172.20.0.1"

 

Portainer

在Docker中部署portainer可视化工具,可以查看和管理本地和远程的Docker容器。

参见 链接 。