docker入门使用
1 、docker原理


2、命令






docker rm -f $(docker ps -aq) :删除所有容器(包括运行中的)
docker exec -it <容器id前三位> bash :进入该容器
docker logs <容器id前三位> :输出该容器日志
3、目录挂载|卷映射
目录挂载
docker run -d -p 80:80 -v /app/ngHtml:/usr/share/nginx/html --name <container_name> my_nginx:v1.0
在wsl新建/app/ngHtml文件夹,映射到container的/usr/share/nginx/html
echo "<h1>hi,nginx<h1>" | sudo tee index.html
在/app/ngHtml下新建index.html并写入
卷映射
直接在run中映射container的/etc/nginx配置,会导致启动失败,因为wsl对应目录是空的
docker run -d -p 80:80 -v /app/ngHtml:/usr/share/nginx/html -v <volumn_name>:/etc/nginx --name test my_nginx:v1.0
使用卷映射,可初始化卷名为ngconf(默认为/var/lib/docker/volumes/ngconf)并映射到容器的/etc/nginx(这是容器配置目录)

同时使用docker volume create <volume_name>可以创建卷名(都放在/var/lib/docker/volumes下),docker volume ls显示所有卷名
docker volume inspect <volume_name>查看卷
4、自定义网络
当两个容器(app)需要网络通信时,使用wsl可能会被拒绝(window防火墙会拒绝容器的连接),使用云服务器也会绕圈(container1->linux->container2),所以使用docker默认的网络(docker0 172.17.0.1,可使用docker network ls查看,其中的bridge就是docker0)
docker container inspect <container_name>可查看容器,可看到容器1的ip为172.17.0.2,容器2为172.17.0.3,容器之间可以通过这个容器ip+容器port直接访问,如curl http://172.17.0.3:80,注意这里的80是容器的端口不是主机端口

但是,当删除容器等操作会导致ip变化,所有使用自定义网络,规则:容器名就是域名
先创建网络docker network create <net_name>,再新建容器
docker run -d -p 80:80 --name <container_name1> --network <net_name> nginx
docker run -d -p 81:80 --name <container_name2> --network <net_name> nginx
再查看容器1,已经被分配了新的ip(由自定义的网络分配的)

此时容器之间可以用域名访问了 curl http://<container_name>:<port>
redis主从集群的例子
首先创建一个redis主节点,要使用自定义网络。-e 用来配置环境
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data
-e REDIS_REPLICATION_MODE=master
-e REDIS_PASSWORD=123456
--network mynet1 --name redis01 bitnami/redis
但是可以发现没有运行起来,docker logs <id前三位>可看到:Can't open or create append-only dir appendonlydir: Permission denied
说明容器无法通过目录挂载修改/app/rd1的数据,(之前nginx只会从卷里读),使用sudo chmod -R 777 rd1修改目录权限
对于从节点也是如此,并进行以下配置
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data
-e REDIS_REPLICATION_MODE=slave
-e REDIS_MASTER_HOST=redis01
-e REDIS_MASTER_PORT_NUMBER=6379
-e REDIS_MASTER_PASSWORD=123456
-e REDIS_PASSWORD=123456
--network mynet1 --name redis02 bitnami/redis

由于我使用的是WSL,不如云服务器方便,当在windows访问redis集群,redis节点之间的地址通告会有问题,就不展示结果了
但是我启动windows的redis失败,关闭容器节点又启动成功说明应该奏效...

一般而言,run一个容器需要考虑网络(容器间通信,端口映射)、存储(conf、data的持久化)、环境变量
5、docker compose
6、dockefile
Dockerfile 负责构建单个服务的运行环境(镜像)(制作零件),而 Docker Compose 负责编排这些服务,让它们(容器)协同工作(组装成一个完整的机器)。
比如django+vue前后端分离应用
your_project/
├── backend/
│ └── Dockerfile
├── frontend/
│ └── Dockerfile
├── docker-compose.yml
各自的dockfile配置其所需的python、node环境,目录等等,docker-compose将所有容器整合到一起(包括后端用的mysql、redis等服务)

浙公网安备 33010602011771号