docker的使用
转自 https://blog.csdn.net/S_gy_Zetrov/article/details/78161154
https://blog.csdn.net/permike/article/details/51879578
docker run -it (--name stack1)id /bin/bash 启动镜像,-it是-i -t的缩写:前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)一般这个模式就是可以启动bash,然后和容器有命令行的交互。--name
参数可以指定启动后的容器名字,如果不指定则docker会帮我们取一个名字。
运行出一个container放到后台运行
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"
-d: 后台运行容器,并返回容器ID;
它将直接把启动的container挂起放在后台运行(这才叫saas),并且会输出一个CONTAINER ID
,通过docker ps
可以看到这个容器的信息,可在container外面查看它的输出docker logs ae60c4b64205
,也可以通过docker attach ae60c4b64205
连接到这个正在运行的终端,此时在Ctrl+C
退出container就消失了,按ctrl-p ctrl-q可以退出到宿主机,而保持container仍然在运行
另外,如果-d启动但后面的命令执行完就结束了,如/bin/bash
、echo test
,则container做完该做的时候依然会终止。而且-d不能与--rm同时使用,可以通过这种方式来运行memcached、apache等。
如果使用exit,命令退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。
启动、停止、重启容器aa97ba3292ce的命令:
~$ docker start aa97ba3292ce~$ docker stop aa97ba3292ce~$ docker restart aa97ba3292ce
将容器转化为一个镜像(即软件装完,保存环境),即执行commit操作,完成后可使用docker images
查看
root@aa97ba3292ce:/#exit //先退出容器~$ docker commit -m "ubuntu with vim" -a "sgy" aa97ba3292ce sgy/ubuntu:vim~$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEsgy/ubuntu vim 52166e4475ed 5 seconds ago 358.1 MBchug/ubuntu14.04x64 latest 0584b3d2cf6d 9 days ago 196.5 MB
其中,-m指定说明信息;-a指定用户信息;aa97ba3292ce代表容器的id;sgy/ubuntu:vim指定目标镜像的用户名、仓库名和 tag 信息。我这里都是为了博客瞎编的用户名,我自己的用户名也不是sgy,你运行命令的时候使用自己注册Docker时的用户名。
此时Docker中就有了我们新建的镜像sgy/ubuntu:vim,此镜像和原有的ubuntu镜像区别在于多了个vim工具。此时我们利用新镜像创建的容器,本身就自带vim了。
删除镜像和容器
~$ docker rm container_id~$ docker rmi image_id
Docker中使用gdb无法进入断点,无法调试
加上--privileged
参数
~$ docker run -it --privileged sgy/ubuntu:vim /bin/bash
-p: 端口映射,格式为:主机(宿主)端口:容器端口 --expose=[]: 开放一个端口或一组端口;
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
-u, --user="" 指定容器的用户 -a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
docker 端口映射的指令是什么
docker指令:docker run -p ip:hostPort:containerPort redis
使用-p参数会分配宿主机的端口映射到容器。
IP表示主机的IP地址。
hostPort表示宿主机的端口。
containerPort表示容器的端口。
支持的格式有三种
ip:hostPort:containerPort:映射指定地址的指定端口到容器的指定端口(不常用)
如:127.0.0.1:3306:3306,映射本机的3306端口到容器的3306端口。
ip::containerPort:映射指定地址的任意端口到容器的指定端口。(不常用)
如:127.0.0.1::3306,映射本机的3306端口到容器的3306端口。
hostPort:containerPort:映射本机的指定端口到容器的指定端口。(常用)
如:3306:3306,映射本机的3306端口到容器的3306端口。
docker run -it -p 12345:54321 images /bin/bash
docker port name 可以查看
54321/tcp -> 0.0.0.0:32772 表示容器的54321端口映射到了主机的12345端口。
查看image或container的底层信息(inspect)
inspect
的对象可以是image、运行中的container和停止的container。
查看容器的内部IP
# docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
172.17.42.35
docker ps
默认显示当前正在运行中的containerdocker ps -a
查看包括已经停止的所有容器docker ps -l
显示最新启动的一个容器(包括已停止的)
查看container中正在运行的进程,docker top <container_id/container_name>
。实际上在host上使用ps -ef|grep docker
也可以看到一组类似的进程信息,把container里的进程看成是host上启动docker的子进程就对了
-P:端口映射,外部端口到容器端口的映射规则由docker负责
-p:自己指定端口映射规则,格式为:-p 外部端口:容器端口
进入容器执行命令
#sudo docker exec -it 容器ID /bin/bash
如果你想通过很快捷的方式查看容器的端口
#sudo docker port 容器ID或容器名称
查看容器的日志
$sudo docker logs 容器ID或容器名称
暂停容器
#sudo docker pause 容器ID //暂停
#sudo docker unpause 容器ID //解除暂停
杀死容器
$sudo docker kill 容器ID或容器名称
docker build -t name
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
也可以通过 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
socat用法
socat udp4-listen:11161,reuseaddr,fork UDP:[监控服务器IP]:161
udp4-listen:在本地建立的是一个udp ipv4协议的监听端口;
reuseaddr,绑定本地一个端口;
fork,设定多链接模式,即当一个链接被建立后,自动复制一个同样的端口再进行监听
参考 https://blog.csdn.net/weixin_36440115/article/details/76464876
连接一个端口:
socat - tcp:192.168.1.1:80 #连接ip 为 192.168.1.1 服务器的80端口
侦听端口
socat - tcp-l:333 #侦听本机的333端口
发送文件:
cat abc.txt | socat - tcp:1.1.1.1:333 #将文件abc.txt发送至1.1.1.1的333端口
接收文件:
socat tcp-l:333 open:a.txt, creat, append #将接收的文件存为a.txt 并追加在文件尾
远程传递shell
socat tcp-l:1234 exec:sh,pty,stderr #当有主机连接本机的1234端口时,将会发送本机的shell给连接端
端口转发
socat tcp-l:22,fork tcp:1.1.1.1:80 #将主机22端口收到的流量重定向至1.1.1.1的80端口
原文出处:https://blog.csdn.net/Vaing_Lory/article/details/81230719