三、容器
创建容器常用选项 docker run …
docker create | 创建完之后不启动 |
---|---|
docker run | 生成一个容器 & 启动 |
docker run -itd | 交互、伪终端、后台运行 |
docker ps | 查看运行着的容器 ps -a 看所有,ps -l 查看最新容器 |
–add-host list |
例1:(1)生成一个容器,名字随意,不带–add-host参数。
docker ps
docker exec fervent_ritchie cat /etc/hosts
(2) 生成一个容器,名字随意,带–add-host 参数
docker run -itd --add-host abc:192.168.1.123 ubuntu
–cap-add | 添加linux特性到容器 |
---|---|
–cid-file /tmp/a.txt | 将容器ID保存到文件中 |
docker run –cidfile /tmp/a.txt ubuntu | 保存容器的pid 到一个文件中,方便统一管理 |
–dns 8.8.8.8 | docker run -itd –dns 8.8.8.8 ubuntu |
-e | 和–env-file将环境变量写到文件中 docker run -itd -e TEST=123 ubuntu |
–expose 3306 | docker run -itd –expose 80 ubuntu ,docker ps -l 查看 |
-h hostname | docker run -itd ubuntu ,随机生成一个容器,hostname也是随机生成的(hostname = 容器ID),如下: |
如果我想自定义指定,docker run -itd -h songyt ubuntu。
【–ip】 | 可以制定IP,但是必须在网段范围内 |
---|---|
docker network create –subnet=10.0.0.0/16 network_10 | 先建个网段 |
docker network ls | 查看所有网段 |
docker run -itd –net=network_10 –ip 10.0.0.123 ubuntu
docker ps -l
docker inspect keen_heisenberg #能看到如下信息表示配置成功。
–link #添加host记录,根据已有hostname的关联一下
docker run -itd -h songyt ubuntu
重新生成一个容器c_b,关联下
c_a IP是0.7,c_b 是0.8
–log-driver (none,name,json,syslog,fluentd…)
#指定日志位置
elk专业日志分析工具
docker run -itd –name c_c –log-driver syslog ubuntu
tail -f /var/log/syslog #容器中的日志都会到宿主机的此文件中
–log-opt
–oom-kill-disable
-p 宿主机端口:容器端口
-P
expose
restart always/
restart on-failiure:3
ulimit #修改最大描述符
docker run -itd –name c_d –ulimit nproc=10240 –ulimit nofile=65535 ubuntu
docker attach c_d
ulimit -a 确认
-v 数据持久化
–volumes-from list
-w #进入容器后所在的工作目录
–cpu-period int
–cpu-quota int
-c –cpu-shares int
–cpuset-cpus
–device-read-bps list
–device-read-iops list
–device-write-iops list
-m –memory bytes #限制内存
–memory-reservation bytes
–memory-swap bytes
–memory-swappiness int
–storage-opt list #限制磁盘空间只支持devicemapper存储驱动
docker run -itd –name c_e -m 10240000 ubuntu
docker attach c_e
cd /sys/fs/cgroup
cat memory.limit _in_bytes
grep 上次输出的值 *
free -m
exit
mount #创建一个容器的时候,默认从宿主机上挂载3个文件,/etc/resove.conf,/etc/hostname,/etc/hosts,每次重启,都挂载一次
–net docker run -itd –net host ubuntu
docker inspect cID
管理命令 docker …
运行场景:是在容器生成后,进行的管理操作
基本命令
start、stop | 启动、关闭 |
---|---|
attach | |
rm | docker rm -f $(docker ps -qa) 删除所有的容器 |
kill | 休眠 |
pause、unpause | |
rename | docker rename c_a c_b |
inspect | 查看所有 |
exec | 体会不同: |
docker exec c_a ls | |
docker exec -it c_a ls | 交互式地输出到标准输出,等同于下面 |
docker exec -it c_a /bin/bash | |
top | 显示容器中运行的进程 docker top c_a |
port | docker port c_a |
cp | 在 宿主机与容器之间,相互copy 文件 |
… | docker cp a.txt c_a:/home; docker exec -it c_a ls /home |
.. | docker cp c_a:/z.txt /tmp |
diff | |
logs docker | logs c_a |
stats | 动态查看 容器利用率 ,交互式打印用docker stats –no-stream c_a |
update | 容器生成后修改一些配置 docker update –help |
events | docker events; 不针对具体docker容器,针对整个docker,可指定时间 |
数据持久化
数据卷
即:将宿主机目录挂载到容器目录
特点:
例子:
(1) 假设宿主机/container_data/web 没有数据,现在挂载下:
docker run -itd --name web01 -v /container_data/web:/data ubuntu
在/container_data/web 下:touch a.txt
docker exec web01 ls /data
(2) 假设宿主机有数据时挂载,容器里也会有数据
接着(1)的操作:
docker run -itd --name web02 -v /container_data/web:/data ubuntu
docker exec web02 ls /data 也是有数据的
容器数据卷
即:将一个运行的容器作为数据卷,让其他容器 通过挂载这个容器 实现数据共享。
运行着的容器(需要先共享出一个数据卷):
docker run -itd --name share -v /data ubuntu #把容器的/data 目录作为共享卷
docker run -itd --name oa --volumes-from share ubuntu #oa容器挂载share容器
在共享的share容器里创建:docker exec share touch /data/index.php
docker exec share ls /data #确认下共享目录是否创建成功
docker exec oa ls /data #到新建的oa的/data/ 下看是否同步了过来
ps:容器 共享出去的目录是双方同步的,类似于百度云盘的共享目录。
搭建lnmp网站平台
创建mysql数据库容器
1. 访问:hub.docker.com/explore
2. docker run -itd --name lnmp_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql --character-set-server=utf8
3. telnet 127.0.0.1 3306 #可以ping通
4. iptables -t nat -vnL #其实是在防火墙里添加了条规则,肯最后一行
5. docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
创建PHP环境容器
1. docker search php #选第一个
2. docker run -itd --name lnmp_web --link lnmp_mysql:db -p 88:80 -v /container_data/web:/var/www/html richarvey/nginx-php-fpm
3. 在宿主机/container_data/web/ 下创建index.php <?php phpinfo() ?>
在浏览器访问:IP:88 #访问不到
iptables -A input -s 宿主机Ip -j accept #将iptables规则清空,再重置了下IP规则
以wordpress博客为例调试
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
tar zxvf wordpress-4.7.4-zh_CN.tar.gz
mv wordpress/* /container_data/web/
浏览器测试访问: http:IP:88