Docker基本命令即操作

      Docker:是对应用的虚拟化,共享了底层宿主机的操作系统内核,是一种标准的应用程序打包、部署方式

      虚拟机技术:对整个操作系统的虚拟化,用于模拟完整的操作系统

 

      Docker在centos上的安装,Ubuntu上的安装可以参考Docker官网给的安装教程

sudo yum install –y docker-io

      启动docker

sudo systemctl start docker

      搜索docker镜像

sudo docker search centos

      获取镜像

 sudo docker pull centos

      查看镜像

sudo docker images

      删除镜像 

sudo docker rmi <镜像名称>

 

      启动容器

sudo docker run --name –h hostname

      列如启动一个‘Hello world’镜像为centos的docker容器

sudo docker run centos /bin/echo ‘Hello world’

      启动自定义名称的docker容器,并进入到容器里面

sudo docker run --name mydocker -it centos /bin/bash

      启动已经创建好的docker容器

sudo docker start <容器ID>

      启动docker容器,并让其在后台运行

sudo docker run -d --name mynginx nginx

 

      交互型容器:运行在前台,通常会指定有交互的控制台,可以给容器输入,也可以得到容器的输出

sudo docker run -it --name <容器名称> <镜像> /bin/bash

      守护型容器:运行在后台,创建启动之后就与终端无关

sudo docker run -d --name <容器名称> <镜像> /bin/bash

      获取容器PID

sudo docker inspect --format “{{.State.Pid}}” <容器ID/容器名称>

      进去正在运行的容器,其中pid、net、ipc、mount、uts分别表示容器的进程、网络、消息、文件系统和主机名

sudo nsenter --target <容器PID> --mount --uts --ipc --net --pid

      停止容器

sudo docker stop CONTAINER ID

 

      查看当前正在运行的容器

sudo docker ps

      查看所有容器,包括运行和停止的

 sudo docker ps -a

      查看最新创建的容器

sudo docker ps -l

      查看最后创建的x个容器

sudo docker ps -n=x

      删除容器

sudo rm CONTAINER ID

 

      Docker没有提供一次性删除所有容器的命令,但是可以用下面的命令来实现这个目的

sudo docker rm ‘docker ps -a -q’

      这个命令会用docker ps列出当前的所有容器,-a标志列出所有容器,-q标志只列出容器的ID,不包括容器的其他信息。然后将这个列表传给docker rm命令,依次删除容器

 

      编写进入容器脚本in.sh

vim in.sh
#!/bin/bash
CNAME=$1
CPID=$(sudo docker inspect --format "{{.Status.Pid}}" $CNAME)
sudo nsenter --target "$CPID" --mount --uts --ipc --net --pid

      赋予脚本可执行权限

sudo chmod u+x in.sh

      进入容器只需 ./in.sh <主机名>

 

      查看网桥情况,可以看出网络中是有docker的网桥的

 brctl show

 

      查看防火墙规则,同样网络中含有docker的防火墙规则

sudo iptables -L

 

      随机映射

sudo docker run -P
sudo docker run -d -P --name mynginx1 nginx

      指定映射

sudo docker run -p hostPort:containerPort
sudo docker run -p ip:hostPort:containerPort
sudo docker run -p ip::containerPort
sudo docker run -d -p 91:80 --name mynginx2 nginx

 

      通过nginx在容器中部署静态网站

sudo docker run -it -p 80 --name web ubuntu /bin/bash 
root@425c7a0e6949:/# apt-get update
root@425c7a0e6949:/# apt-get install nginx
root@425c7a0e6949:/# apt-get install vim
root@425c7a0e6949:/# mkdir -p /var/www/html
root@425c7a0e6949:/# cd /var/www/html/
root@425c7a0e6949:/var/www/html# vim index.html
root@425c7a0e6949:/var/www/html# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@425c7a0e6949:/var/www/html# ls /etc/nginx/
root@425c7a0e6949:/var/www/html# ls /etc/nginx/sites-enabled/
root@425c7a0e6949:/var/www/html# vim /etc/nginx/sites-enabled/default(将root后的目录改为自己创建的静态网站的目录)
root@425c7a0e6949:/var/www/html# cd
root@425c7a0e6949:~# nginx
root@425c7a0e6949:~# ps -ef

      在宿主机查看正在运行的容器,可以看到容器映射的端口信息

sudo docker ps

      也可以直接查看容器映射的端口号和容器内进程

sudo docker port web
sudo docker top web

      可以在通过宿主机本地IP加上端口号查看所创建的网页,也可以直接通过容器IP查看,当然也可以在浏览器里面直接输入IP地址

curl http://127.0.0.1:<端口号>
curl http://172.17.0.2

 

      使用commit构建镜像

sudo docker commit <容器名称/容器ID> <镜像名称>

 

      使用Dockerfile构建镜像

mkdir -p dockerfile/df_test1
cd dockerfile/df_test1
vim dockerfile
#First dockerfile for test
FROM ubuntu
MAINTAINER(维护人信息)
RUN apt-get update
RUN apt-get install nginx
EXPOSE 80
sudo docker build -t=<镜像名称> 

 

      Dockerfile的指令

# 后面跟着注释的内容

INSTRUCTION argument <指令以大写的指令名开头,后面跟指令的参数>

FROM <镜像名> (已经存在的镜像,也成为基础镜像,必须是Dockerfile中第一条非注释指令)

MAINTAINER <name> (指定镜像的作者信息,包含镜像的所有者和联系信息)

RUN <command>

EXPOSE <port> (指定该镜像运行的容器使用的端口)

 

      Dockerfile构建过程

从基础镜像运行一个容器

执行一条指令,对容器作出修改

执行类似docker commit的操作,提交一个新的镜像层

再基于刚提交的镜像运行一个新的容器

执行Dockerfile中的下一条指令,直至所有指令执行完毕

 

      commit构建镜像实例

对镜像进行升级
root@e8730dd51d57:/# apt-get update

安装网络工具
root@e8730dd51d57:/# apt-get install net-tools

安装Ping工具
root@e8730dd51d57:/# apt-get install iputils-ping

sudo docker commit <容器ID> 名字/镜像

      再用sudo docker images去查看可以发现多处了镜像 

 

      在另外一个终端中进入已经运行的容器

sudo docker attach <容器ID>
sudo docker exec -it <容器ID> /bin/bash

 

      利用docker logs命令来查看容器日志,其中-f标志可以查看实时日志,-t标志可以日志产生的时间,也可以用--tail标志来指定查看日志的最后部分

sudo docker run -d --name logs ubuntu /bin/sh -c "while true;do echo Hello world;sleep 1;done"
sudo docker logs -t logs
sudo docker logs -f logs
sudo docker logs -t -f --tail=0 logs

 

      查看容器内进程

sudo docker top <容器名称>

      查看docker守护进程

sudo ps -ef | grep docker

      启动停止docker守护进程

sudo service docker start
sudo service docker stop
sudo service docker restart

 

      修改docker0默认分配的ip地址

sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0 
sudo service docker restart

      添加虚拟网桥

sudo ovs-vsctl add-br br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

      更改docker守护进程的启动配置:

/etc/default/docker中添加DOCKER_OPTS值  -b=br0

 

      拒绝所有容器间互联

/etc/default/docker中添加DOCKER_OPTS值  --icc=false,然后再用重启docker守护进程

sudo vim /ect/default/docker
DOCKER_OPTS=”--icc=false”
sudo service docker restart

      允许特定容器间的连接

Docker守护进程的启动选项

--icc=false --iptables=true

--link 在容器启动时添加link

docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问

 

      查看docker网络

sudo docker network ls
sudo docker network inspect <网络类型>

      建立自己的网络

sudo docker network create --driver bridge mynet

      让容器运行在自己创建的网络中

sudo docker run -it --network=mynet --name <容器名称> <镜像>

 

 

      数据卷是经过特殊设计的目录,可以绕过联合文件系统,为一个或多个容器提供访问

      数据卷的设计目的,在于数据的永久化,它完全独立于容器的生成周期,因此,docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾手机机制,对容器引用的数据卷进行处理

 

      数据卷的特点

    (1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中

    (2)数据卷可以在容器之间共享和重用

    (3)可以对数据卷里的内容直接进行修改

    (4)数据卷的变化不会影响镜像的更新

    (5)卷会一直存在,即使挂载数据卷的容器已经被删除

 

      为容器添加数据卷

      在用docker run命令的时候,使用-v标记来添加一个数据卷。在一次run中多次使用可以挂载多个数据卷,下面加载一个卷到web容器上

sudo docker run -it --name web -v /web ubuntu /bin/bash

      web是容器中的目录,目录不存在会重新创建

 

      挂载一个主机目录作为数据卷

sudo docker run -it --name web -v /opt/web:/web ubuntu /bin/bash

      为数据卷添加访问权限为只读

sudo docker run -it --name web -v /opt/web:/web:ro ubuntu /bin/bash

      挂载一个宿主主机文件作为数据卷

sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

      创建一个容器数据卷

sudo docker run -itd -v /logdata --name logdata ubuntu

      在其他容器中挂载logdata容器的数据卷

sudo docker run -itd --name web1 --volumes-from logdata ubuntu
udo docker run -itd --name web2 --volumes-from logdata ubuntu

 

      备份

sudo docker run --volumes-from logdata -v /containet_backup:/backup ubuntu tar cvf /backup/backup.tar /data

 

      恢复

      先创建一个数据卷

sudo docker run -v /data --name logdata2 ubuntu

      再将备份文件恢复到这个数据卷容器

sudo docker run --volumes-from logdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar

      最后启动一个容器挂载验证/data目录数据恢复成功

sudo docker run -itd --volumes-from logdata2 --name web_recover ubuntu

 

      迁移容器和镜像

      先创建测试容器

sudo docker exec web touch /opt/test.txt
 sudo docker exec web ls /opt

      执行导出

sudo docker export web > web.tar

      执行导入

cat web.tar | sudo docker import - web:v2

      启动容器

sudo docker run -itd --name web_v2 web:v2 /bin/bash

      进入容器查看

 sudo docker exec web_v2 ls /opt

      导出

sudo docker save web > web.tar

      导入

 sudo docker load < web.tar

 

posted @ 2018-10-16 01:05  Chenjin2018  阅读(1470)  评论(0编辑  收藏  举报