apt install docker-compose
docker version
docker run hello-world
systemctl enable docker
systemctl start docker
systemctl stop docker
systemctl restart docker
# vim /etc/docker/daemon.json
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6c3kptqz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker search mysql
#搜索收藏数大于3000的镜像
docker search mysql --filter=STARS=3000
docker pull mysql
docker pull mysql:5.7
docker rmi -f 镜像id
docker rmi -f 镜像id 镜像id 镜像id
删除全部的镜像
docker rmi -f $(docker images -aq)
docker rmi $(docker images | grep "linglong" | awk '{print $3}')
# 自制镜像案例
docker run -d -it debian /bin/bash # 后台运行
docker ps # 查看id baf95021d6f4
docker exec -it baf95021d6f4 /bin/bash # 进入
# 改源
echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" > /etc/apt/sources.list
apt-get update
apt-get install vim # 安装vim
exit
# docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
docker commit -m="debian装好vim" -a="xiaoxiaoran" baf95021d6f4 mydebian:1.0
docker images
docker run -it mydebian:1.0 /bin/bash
docker run [可选参数] image
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
(-p ip:主机端口:容器端口 配置主机端口映射到容器端口)
-P 随机指定端口(大写的P)
docker run -it debian /bin/bash
docker run -p 4444:80 -it 06d20309031e /bin/bash
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" lasticsearch
# exit 停止并退出容器(后台方式运行则仅退出)
# Ctrl+P+Q 不停止容器退出
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
docker ps -n=3 -q
docker ps -aq
docker rm 容器id
#删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -aq|xargs docker rm #删除所有的容器
docker ps -n=3 -q|xargs docker rm #删除前3个容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
# 日志的查看
docker logs -tf 容器id
# 查看容器中进程信息
docker top 容器id
# 查看容器的元数据
docker inspect 容器id
docker exec -it 容器id /bin/bash
docker attach 进入容器正在执行的终端,不会启动新的进程
docker exec 进入容器后开启一个新的终端,可以在里面操作
#拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
docker cp 2d2e85d3ef6a:/1.txt /mnt/hgfs/mykali/5.txt
#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径
docker cp /mnt/hgfs/mykali/3.sh 2d2e85d3ef6a:/1.sh
docker exec -it 2d2e85d3ef6a cat /1.sh
docker run -it -v 主机内目录:容器内目录 镜像名/id
docker run -it -v /mnt/hgfs/mykali:/mnt -d python
docker exec -it 61a640351b0c ls /mnt
docker inspect 61a640351b0c | grep -A 9 "Mounts"
"Mounts":
"Type": "bind",
"Source": "/mnt/hgfs/mykali", # 对应主机的源目录
"Destination": "/mnt", # 容器中的目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
docker run -d -v 容器内目录 镜像名/id # 匿名挂载
docker run -it -v /mnt -d python
匿名挂载后,查看所有挂载的卷
docker volume ls
每一个VOLUME NAME对应一个挂载的卷,由于挂载时未指定主机目录,因此无法直接找到目录。
docker run -d -v 卷名:容器内目录 镜像名/id
docker run -it -v volue01:/mnt -d python
可以发现挂载的卷:volue01
通过以下命令找到主机内目录:
docker volume inspect 卷名
docker volume inspect volue01
"CreatedAt": "2022-07-31T07:49:45-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/volue01/_data", <===
"Name": "volue01",
"Options": null,
"Scope": "local"
所有docker容器内的卷,在未指定主机内目录时,都在:/var/lib/docker/volumes/卷名/_data 下,
可通过具名挂载可以方便的找到卷,因此广泛使用这种方式进行挂载。
docker run -it --name container02 --volumes from container01 镜像名/id # 将两个容器进行挂载,实现两容器间数据同步
命令 | 效果 |
---|---|
FROM | 基础镜像:Centos/Ubuntu |
MAINTAINER | 镜像作者+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 为镜像添加内容(压缩包) |
WORKDIR | 镜像工作目录(进入容器时的目录) |
VOLUME | 挂载的目录 |
EXPOSE | 暴露端口配置 |
CMD/ENTRYPOINT | 指定这个容器启动时要运行的命令(CMD替代先前命令,ENTRYPOINT在先前命令后追加) |
COPY | 类似于ADD,将文件拷贝到镜像中 |
ENV | 构建时设置环境变量 |
docker build -f 文件路径 -t 镜像名 .
docker run # 运行镜像
docker push # 发布镜像
FROM debian
CMD /bin/bash
CMD echo Hello Dockerfile
docker build -f ./6.dockerfile -t mydocker .
docker run -it mydocker
echo "export flag=flag{ushfekjhvfegehveh32562f2dfw6wtw}" >> /etc/profile
docker0: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:e9:f4:98:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:e9ff:fef4:9803/64 scope link
valid_lft forever preferred_lft forever
7: vethb7a6d3d@if6: mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether be:49:2d:bb:2a:72 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::bc49:2dff:febb:2a72/64 scope link
valid_lft forever preferred_lft forever
6: eth0@if7: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
kali -> 6: eth0@if7 -> 7: vethb7a6d3d@if6 -> docker0(路由器)
桥接 evth-pair虚拟设备接口
docker run -d -P --name kali02 --link kali01 kali 可以使用名字就可以互联
docker exec -it kali02 cat /etc/hosts
172.0.0.1 kali01 ewiuhfwuewgui 原理
docker network ls
自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetname
跨网络连通
docker network connect mynetname kali02 一个容器,两个ip
test
├── app.py
├── docker-compose.yml
├── Dockerfile
└── requirements.txt
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
FROM python
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
ENV flag flag{xiaoxiaoran}
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
flask
redis
docker-compose up -d
docker run --env flag=flag{vhdsfvjsg2} -d -p 8833:80 test_web
docker exec -it 79adc5287bbb /bin/bash -c "cat /1.txt"