Docker 的基本命令和使用
———————— 基本使用 ————————
// docker自身的大本营在:
//大本营 /var/lib/docker // volumes 挂载: /var/lib/docker/volumes
// 搜索和下载镜像:
docker search nginx // 搜索镜像 docker pull nginx // 下载官方的nginx,这个包名在搜索的结果中。
// 查看镜像、容器、网络、挂载卷
docker images // 会看到当前已经下载的所有镜像,包括前面下载的nginx docker ps // 查看运行中的容器 docker ps -a // 查看所有容器,包括已经停止了的容器 docker network ls // 查看所有网络 docker history 016315c7d299 // 查看容器的每一层
docker inspect mynginx //获取容器/镜像的元数据
docker inspect mynginx | grep "IPAddress" | 获取 IP 地址
docker volume ls //查看所有挂载卷
// 启动、停止和删除镜像、容器、网络:
// 新建并启动一个容器,命名为 mynginx,使用镜像为 nginx:latest。请查看本词条下的说明 docker run --name mynginx -p 80:80 -v /data:/data -d nginx:latest // 启动一个停止的容器 docker container start 016315c7d299 // 停止一个容器 docker container stop 016315c7d299 docker stop 4c0e37e3bc0c // 停止所有容器 docker stop $(docker ps -aq) // 删除镜像 docker rmi 4ab4c602aa5e // 删除所有镜像 docker rmi $(docker images -q) // 删除指定的容器 docker rm 4c0e37e3bc0c // 删除所有容器 docker rm $(docker ps -aq) // 创建自定义网络 docker network create 自定义网络名 // 删除网络 docker network rm xxx
// 删除挂载卷
docker volume rm xxx
———— 使用镜像 nginx:latest,将容器命名为mynginx。以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
// 【重要】关于 -v 参数的说明,也就是创建数据卷。
-v /data:/data 表示,本地主机的 /data 目录挂载到 docker 的/data 目录下。这种方式的好处在于:
1.数据卷可以在容器之间共享和重用;
2.对数据卷的内容进行修改,会立刻生效;
3.数据卷内容并不包含在镜像中,所以不会影响镜像;
———— 所以,其实就是正常应该把项目放在数据卷中,因为数据卷是公用的,所以配置容器内的 nginx 指向项目目录即可。
// 在运行的容器中执行命令 - exec:
// 查看 docker 下的所有容器 docker ps // 查看当前 docker-compose 下的容器 docker-compose ps // 进入容器,你会发现你的机器名称变成了 docker 容器的名称 docker exec -it webserver bash 或者 docker exec -it f75a710a2b58 bash // 在容器f75a710a2b58内进行 linux 命令行操作 echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html // 在容器里面安装 vim apt-get update apt-get install vim //退出 exit
// 保存容器为新镜像 - commit - 一般不用这个,使用 dockerfile
// 将f75a710a2b58容器保存为新的镜像。 docker commit f75a710a2b58 mynginx:v1
—— 新的镜像里面的所有内容,都被保存了下来。包含改过的所有的配置文件。
// 标记一个 images ,
docker tag 1786dad83d25 hello-docker:1.0.0 //记得删除原来的tag
// 查看容器信息:
// 显示容器的进程 docker top mystifying_keller // mystifying_keller是容器的名字 // 查看容器端口映射 docker port ngnix-test 或 docker port 016315c7d299 //80/tcp -> 0.0.0.0:80 //查看容器数据结构 docker diff 016315c7d299 或者 docker diff nginx-test // 查看容器日志记录 docker log mymysql1
// 主机与docker之间数据拷贝:—— 少用,一般挂载就好了。直接把项目/数据放入容器的情况,一般是已经做好,直接卖的项目。
// 将主机 ~/index.html 文件拷贝到容器 96f7f14e99ab的 /usr/share/nginx/html/ 目录下。 docker cp ~/index.html 96f7f14e99ab:/usr/share/nginx/html // 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。 docker cp 96f7f14e99ab:/www /tmp/
// 导入和导出容器快照到本地文件:
// 导出快照 docker export 016315c7d299 > nginx_test.tar // 导入快照( 导入后镜像仓库名为test/nginx,tag 为2.2 ) // 第一种、本地文件导入 cat nginx_test.tar | docker import - test/nginx:v2.2 // 第二种使用 url 导入 docker import http://example.com/exampleimage.tgz test/nginx:v2.2
// docker 中安装 vim:
apt-get update apt-get install vim
// 查看网络:
// 查看 myphp 容器的内网地址 docker inspect myphp |grep '"IPAddress"' //172.17.0.2 // 查看 mynginx 容器的内网地址: docker inspect mynginx |grep '"IPAddress"' //172.17.0.3
—— 使用 exec 进入容器,172.17.02和172.17.0.3是可以相互 ping 通的,可以相互通信。
———————— Registry镜像仓库 ————————
// 登录镜像仓库:
// 登录,server可选,如不写则默认是登录官方仓库。 docker login -u 用户名 -p 密码 [server] // 登出 docker logout
// 标记本地镜像,将其归入某一仓库:
// 打包镜像 docker tag nginx:latest raven666/nginx:v1.2 // 推送镜像到仓库,你可以登录 hub.docker.com 查看自己的镜像 docker push raven666/nginx:v1.2 //查找镜像 docker search raven666
—— 将本地 nginx:latest 镜像打包为 raven666/nginx:v1.2 镜像,raven666/nginx 为仓库名,v1.2为 tag。一般我们会命名为 => [名称/软件名:tag]
———————— 私有仓库 ————————
可以在本地建立仓库。并把镜像传到里面。格式按照 127.0.0.1:5000/ubuntu:latest 这样的格式进行 tag 。。具体不赘述。
———————— 数据持久化 ————————
一、通过 volume 挂载卷,如:———— 数据持久化的最佳方式
需要在 Dockerfile 文件里面指定volumes 指定参数
volumes: - ${DIR_WWW}:${DIR_WWW}:rw - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./log/nginx/:/var/log/nginx/:rw
可以通过 docker volume 进行管理
二、Bind Mount方式:
run 的时候通过 -v 参数进行挂载本地:
docker run -p 80:80 --name mynginx \ -v $PWD/www:/www \ -v $PWD/nginx/conf.d:/etc/nginx/conf.d \ --privileged=true \ -d nginx