docker 相关
1、docker 的安装
win:
在 dockerhub 最下面 找到dockerDesktop 下载
dockerDesktop是包含docker compose
linux:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者
curl -sSL https://get.daocloud.io/docker | sh
也可以
wget -O - https://raw.githubusercontent.com/Zo3i/OCS/master/docker/docker-all2.sh | sh
这个是包含docker-compose的
安装好了换源
linux
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m3dz4myl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
windows dockerDesktop 设置- Docker Engine
"registry-mirrors": [
"https://m3dz4myl.mirror.aliyuncs.com"
],
manjaro 直接pacman 或者pamac 可视化可以搜索到docker docker-compose(大爱manjaro)
2、docker常用命令
镜像搜索
搜索仓库centos的镜像
docker search centos
--filter=stars=600:只显示 starts>=600 的镜像
docker search --filter=stars=600 centos
--no-trunc 显示镜像完整 DESCRIPTION 描述
docker search --no-trunc centos
镜像下载
下载centos最新镜像
docker pull centos
下载仓库所有centos镜像
docker pull -a centos
镜像查看
列出本地images
docker images
含中间映像层
docker images -a
镜像删除
删除centos镜像(可以删除多个,空格间隔)
docker rmi centos
强制删除
docker rmi -f centos
删除本地所有镜像
docker rmi $(docker images -q)
新建并启动容器
以交互模式新建并启动一个名字为centos_test的centos容器
docker run -it --name centos_test centos
以后台运行的方式新建并启动容器
docker run --it -d --name centos_test centos
启动名字为centos_test的容器
docker start centos_test
restart 重启容器
查看容器
查看正在运行的容器
docker ps
-s 显示容器文件大小
-q 显示容器的ID
-a 显示所有容器
停止和删除容器
停止容器centos_test
docker stop centos_test
杀掉一个容器
docker kill centos_test
删除停止的容器
docker rm centos_test
强制删除容器
docker rm -f centos_test
删除所有容器
docker rm $(docker ps -aq)
进入容器
进入容器
docker exec -it centos_test bash
Dockerfile
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
FROM:指定基础镜像
示例:
FROM mysql:5.6
MAINTAINER:维护者信息
示例:
MAINTAINER yukai
RUN:在容器中运行命令
示例:
RUN pip install flask -i https://pypi.douban.com/simple/
ADD:将本地文件添加到容器中,tar类型会自动解压,可以访问网络资源
示例:
ADD * /opt/
ADD test.txt /opt
COPY:和ADD类似 不会自动解压 不能访问网络资源
CMD:容器启动时调用的命令
示例:
RUN echo hello word
RUN java -jar test.jar
EXPOSE:指定于外界交互的端口
示例:
EXPOSE 5500
EXPOSE 80 443
EXPOST 8888/tcp 7777/udp
WORKDIR:指定工作目录,指定后Dockerfile的命令都会在该目录下指定,进入容器也会在该目录下
示例:
WORKDIR /opt
Dockerfile 示例
#基础镜像
FROM python
#复制文件
COPY app.py /opt/docker_test/
#执行命令
RUN pip install flask redis -i https://pypi.douban.com/simple/
#设置工作目录
WORKDIR /opt/docker_test
#映射端口
EXPOSE 8666
#启动容器后运行
CMD flask run -h 0.0.0.0 -p 8666
app.py
import redis
from flask import Flask
app = Flask(__name__)
redis = redis.Redis(port=6379, decode_responses=True)
@app.before_first_request
def init():
try:
redis.set('name', 'redis')
except:
pass
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/h')
def hello_redis():
try:
string=redis.get('name')
except:
string='docker'
return 'hello ' + string
if __name__ == '__main__':
app.run()
在Dockerfile所在路径运行
docker build -t flask .
docker images 可以看到flask镜像
执行
docker run -itd --name flask -p 8666:8666 flask
访问IP:8666 可以看到hello word
访问IP:8666/h 可以看到hello docker
docker-compose
通过一个单独的docker-compose.yml模板文件,来定义一组相关联的应用容器为一个项目
docker-compose.yml示例
version: '2'
services:
redis:
image: redis
container_name: redis
network_mode: host
ports:
- 6379
web:
#从当前的Dockerfile制作镜像
build: .
#容器名
container_name: flask
network_mode: host
#依赖于redis 防止redis在web后启动
depends_on:
- redis
ports:
- 8666
执行
docker-compose up -d
这时就启动了flask容器和redis的容器
访问IP:8666 可以看到hello word
访问IP:8666/h 可以看到hello redis
中途遇到的坑:
docker-compose.yml定义的 network_mode: host
win本机访问不到 最后发现docker-desktop使用了wsl2
wsl2使用的是虚拟机 物理机无法访问wsl2
使用linux一切正常