读书笔记---《Docker 技术入门与实践》---其一
一、镜像
1.1、搜索
搜索所有nginx镜像
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11305 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1588 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 709 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 506 [OK]
webdevops/php-nginx Nginx with PHP-FPM 125 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 98 [OK]
bitnami/nginx Bitnami nginx Docker Image 65 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 59
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
zabbix/zabbix-web-nginx-pgsql Zabbix frontend based on Nginx with PostgreS… 33 [OK]
tobi312/rpi-nginx NGINX on Raspberry Pi / ARM 26 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 18
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 15 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 14 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
wodby/drupal-nginx Nginx for Drupal container image 12 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 10
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 7
nginxinc/nginx-unprivileged Unprivile ged NGINX Dockerfiles 4
1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
mailu/nginx Mailu nginx frontend 3 [OK]
travix/nginx NGinx reverse proxy 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on same… 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
wodby/nginx
按条件搜索
--filter=[]
搜索官方nginx镜像
$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. [OK]
搜索收藏数高于100的镜像
$ docker search --filter=stars= nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… [OK]
webdevops/php-nginx Nginx with PHP-FPM [OK]
1.2、prune
用于删除系统中遗留的临时镜像文件,以及没有被使用的镜像
$ docker image prune -f
Total reclaimed space: 0B
1.3、导出导入镜像
首先从镜像源下载镜像
$ docker pull ubuntu:18.04
通过save命令导出镜像为tar包
$ docker save -o ubuntu_18..tar ubuntu:18.04
删除镜像
$ docker rmi ubuntu:18.04
使用cat结合import命令导入镜像
$ cat ubuntu_18..tar | docker import - ubuntu:18.04
也可以使用下面命令导入镜像
$ docker load < ubuntu_18..tar
1.4、push上传到镜像库
首先打开docker hub的网站进行注册
https://hub.docker.com
之后登陆网站,点击 “Create Repository” 创建仓库, 仓库名即为自己的用户名 XXXXX,填写 “Name” 即仓库下一级的文件名 ubuntu,选择 “Public”,设置为公开模式。
把要上传的镜像打上标记
$ docker tag ubuntu:latest XXXXX/ubuntu:latest
登陆库,输入账户名和密码
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: XXXXX
Password:
上传镜像
$ docker push XXXXX/ubuntu:latest
再次查看镜像库网站,发现已经上传完成。
二、容器
2.1、create 容器
只是创建容器,不启动,如果没有要启动的镜像,则需要自动pull下镜像,然后再创建容器
$ docker create -it ubuntu:latest
启动需要start
首先查看镜像,ps 是查看运行的容器,加上 -a 参数会查询所有的容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
553fe2651182 ubuntu:latest "/bin/bash" seconds ago Created brave_joliot
启动容器,加上容器ID或者容器名
$ docker start 553fe2651182
使用run创建并启动
$ docker run -it ubuntu:latest
2.2、暂停容器
后台启动容器
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看日志发现一直在输出信息,c1f7afa8a509 是容器ID
$ docker logs -f c1f7afa8a509
暂停容器运行
$ docker pause c1f7afa8a509
暂停之后使用 docker ps 查看发现容器还在,但是状态变为 Paused,另外查看日志发现不在滚动了。
2.3、-t、--time 等待指定时间后再终止容器运行,默认 10 秒
$ docker stop --time= c1f7afa8a509
2.4、prune 清除处于停止状态的容器
$ docker container prune
2.5、进入容器
attach:
同时多个窗口进入同一个容器时,所有窗口都是同步显示的,一个窗口阻塞了,其他窗口也无法执行,这是一个弊端吧。
exec:
1.3.0版本后多了上边的这个命令,可以再运行的容器内执行任意命令。
重要的参数:
-d, --detach 在容器中后台执行命令
--detach-keys="" 指定将容器切回后台的按键
-e, --env=[] 指定环境变量列表
-i, --interactive=ture|false 打开标准输入接受用户输入命令,默认值为false
--privileged=ture|false 是否给执行命令以高权限,默认值为false
-t, --tty=ture|false 分配伪终端,默认值为false
-u, --user="" 执行命令的用户名或ID
例如下面的例子:
$ docker exec -it 553fe2651182 /bin/bash
进入容器,启动bash,但是并不影响其他打开的窗口。
2.6、导入导出
可以使用 -o 参数,或者使用重定向导出容器
进入容器,创建目录,文件,写入文件内容
export 导出容器
下面两种方式都可以
$ docker export -o running_ubuntu1.tar 553fe2651182
$ docker export 553fe2651182 >running_ubuntu2.tar
import 导入容器文件为镜像
$ docker import running_ubuntu1.tar test/ubuntu:v1.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1. c24420ad0828 seconds ago .5MB
运行容器
$ docker run -it test/ubuntu:v1. /bin/bash
查看目录文件及文件内容,都和之前的一样。
load和import的区别,import导入的方式,容器快照文件丢失了所有的历史记录和元数据信息,仅保存当时的容器快照状态,而镜像存储文件将保存完整记录,体积更大,另外从容器快照导入时可以重新指定标签等元数据信息。
2.7、查看容器信息
查看容器进程
$ docker top 553fe2651182
UID PID PPID C STIME TTY TIME CMD
root : pts/ :: /bin/bash
root : pts/ :: /bin/bash
查看统计信息
$ docker stats 553fe2651182
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
553fe2651182 brave_joliot 0.00% 844KiB / .789GiB 0.05% 648B / 0B 0B / 0B
查看容器内数据修改
$ docker container diff 553fe2651182
A /data
A /data/data
A /data/data/test1.txt
A /data/data1
A /data/data1/test2.txt
A /data/test.txt
查看容器端口映射
$ docker container port 553fe2651182
2.8、本地和容器拷贝文件
本地创建目录,文件,输入内容到文件,把本地文件拷贝到容器。
$ docker cp data 553fe2651182:/data/
把当前目录下 data 目录拷贝到容器 /data 目录,之后在容器上发现目录 data 及文件,文件内容一致
在容器创建目录,文件,输入内容到文件,把容器文件拷贝到本地。
$ docker container cp 553fe2651182:/data/data1 .
把容器 /data/data1 目录拷贝到当前目录,之后在当前目录下发现目录 data1 及文件,文件内容一致。
三、数据管理
对数据进行持久化,或者需要在多个容器之间进行数据共享,就涉及到容器的数据管理操作。
管理数据方式:
1)数据卷(Data Volumes): 容器内数据直接映射到本地主机环境
2)数据卷管理(Data Volumes Containers): 使用特定容器维护数据卷
数据卷:
一个可供容器使用的特殊目录,将主机操作系统目录直接映射进容器,类似Linux中mount。
创建数据卷
$ docker volume create -d local test
3.1、数据卷容器
创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
$ docker run -d -it -v /dbdata --name dbdata ubuntu
然后,创建其他两个容器使用 --volumes-from 来挂载dbdata容器中的数据卷
$ docker run -d -it --volumes-from dbdata --name db1 ubuntu $ docker run -d -it --volumes-from dbdata --name db2 ubuntu
进入容器dbdata
$ docker exec -it CONTAINER_ID /bin/bash
进入目录 dbdata ,创建文件 test
结果进入其他两个容器的 dbdata目录,也存在test文件
3.2、利用数据卷容器来迁移数据
使用下面命令来备份数据卷容器dbdata内的数据卷
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
说明:
利用ubuntu镜像创建一个容器worker,使用 --volumes-from dbdata 参数来让worker容器挂载dbdata数据卷;使用 -v $(pwd):/backup 参数来挂载本地的当前目录到worker容器的/backup 目录 。
worker容器启动后,使用tar cvf /backup/backup.tar /dbdata 命令将/dbdata 下内容备份为容器的/backup/backup.tar,即宿主机当前目录下的backup.tar。
四、端口映射和容器互联
4.1、外部访问容器应用
-p或者-P 参数指定端口映射,-P(大写),docker会随机映射一个49000~49900的端口到内部开放的网络端口:
$ docker run -d -P training/webapp python app.py
使用 docker ps 可以查看本地主机和docker容器的端口信息,可以看到本地主机的32768映射到了容器的5000端口。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3fc4f8e721b training/webapp "python app.py" seconds ago Up seconds 0.0.0.0:->/tcp jolly_turing
-p(小写)可以指定要映射的端口,一个指定端口上只可以绑定一个容器,映射本地5000端口到容器5000端口,默认绑定的本地的所有地址:
$ docker run -d -p : training/webapp python app.py
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc2c5af48a89 training/webapp "python app.py" minutes ago Up minutes 0.0.0.0:->/tcp mystifying_colden
绑定多个端口
$ docker run -d -p : -p : training/webapp python app.py
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f57b63b16bde training/webapp "python app.py" seconds ago Up seconds 0.0.0.0:->/tcp, 0.0.0.0:->/tcp reverent_payne
映射指定地址的指定端口
$ docker run -d -p 127.0.0.1:: training/webapp python app.py
绑定 localhost 的任意端口到容器的5000 udp端口,本地主机自动分配一个端口
$ docker run -d -p 127.0.0.1::/udp training/webapp python app.py
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b00e96919a9e training/webapp "python app.py" seconds ago Up seconds /tcp, 127.0.0.1:->/udp jolly_cori
可以使用docker port 来查看当前映射的端口配置,可以看到绑定的本地地址和端口
$ docker port jolly_cori /udp
127.0.0.1:
4.2、互联机制实现便捷互访
创建数据库容器,--name 是为容器命名,容器的名称是唯一的
$ docker run -d --name db training/postgres
创建web容器,并连接到db容器,--link 参数格式是 --link name:alias ,name 是容器名称,alias 是别名
$ docker run -d -P --name web --link db:db training/webapp python app.py
env 可以查看web容器的环境变量
$ docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=727e6c623a3f
DB_PORT=tcp://172.17.0.8:5432
DB_PORT_5432_TCP=tcp://172.17.0.8:5432
DB_PORT_5432_TCP_ADDR=172.17.0.8
DB_PORT_5432_TCP_PORT=
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
进入web容器
$ docker run -t -i --rm --link db:db training/webapp /bin/bash
查看web容器的hosts文件
root@b9d26daaf8eb:/opt/webapp# cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.8 db 6e043f32681a
172.17.0.9 b9d26daaf8eb
这里有两个hosts信息,第一个是db容器,第二个是web容器
ping命令测试和db容器的连通
首先安装工具,然后执行ping命令
root@b9d26daaf8eb:/opt/webapp# apt-get install -yqq inetutils-ping
root@b9d26daaf8eb:/opt/webapp# ping db
PING db (172.17.0.8): data bytes
bytes from 172.17.0.8: icmp_seq= ttl= time=0.311 ms
bytes from 172.17.0.8: icmp_seq= ttl= time=0.115 ms
bytes from 172.17.0.8: icmp_seq= ttl= time=0.109 ms
会把容器名解析为地址
用户可以链接多个子容器到父容器,比如可以链接多个web到同一个db容器。
最新文章
- [C#] 使用NPOI将Datatable保存到Excel
- 512M内存编译php出错
- MySQL使用索引的场景及真正利用索引的SQL类型
- c++实现之 -- 文章TF-IDF值的计算
- 利用SOLR搭建企业搜索平台 之——模式配置Schema.xml
- firebug js版
- Dynamics CRM 开发模板使用手册(插件开发)
- 利用jQuery打造个性网站
- [原]基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息
- C#一定比C++性能差?当然不!破除迷信,从我做起!
- Shiro第六篇【验证码、记住我】
- FFPLAY的原理(二)
- 获取本地的jvm信息,进行图形化展示
- 在Hadoop 2.3上运行C++程序各种疑难杂症(Hadoop Pipes选择、错误集锦、Hadoop2.3编译等)
- [PHP] 看博客学习插入排序
- 【Git 使用笔记】第三部分:多分支开发
- 洛谷 P1072 Hankson 的趣味题 解题报告
- OpenCV---Canny边缘提取
- Java Tread多线程(1)实现Runnable接口
- windows config yii framework
热门文章
- mybatis 教程(mybatis in action)
- 如何在web项目中配置Spring的Ioc容器
- LeetCode Array Medium 11. Container With Most Water
- Linux面试基础(一)
- LinkedBlockingQueue 学习
- Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火
- Dart编程实例 - 第一个Dart程序
- Spring源码剖析3:Spring IOC容器的加载过程
- Go语言基础:make,new, len, cap, append, delete方法
- unittest框架学习笔记五之参数化