Docker的安装与配置和基础使用教程
@[toc]## 1. 安装docker本人是windows安装docker,但是docker要在linux环境下使用,所以我们必须要模拟一个linux环境,这里我们使用wsl,因为wsl比较轻量(如果是linux可以直接安装)1. 按下win键打开菜单,搜索启用或关闭Windows功能2. 打开该选项,重启电脑
3. 安装wsl4. 右键开始菜单,打开Powershell,或者按住win+R输入powershell
5. 输入命令
wsl --update --web-download6. 安装Docker Desktop(可以和我一样在微软商店下载,也可以在官网下载)安装直接默认下一步即可
7. 按住win+r输入cmd,打开之后输入
docker --version,如果正确输出版本号就结束了## 2. Docker常见命令1. docker需要修改一下配置文件,否则在国内无法直接下载镜像
~~~docker //复制下面的配置然后删除原文粘贴即可 { “registry-mirrors”: [ “https://docker.1ms.run”, “https://docker.m.daocloud.io”, “https://docker.xuanyuan.me” ] } ~~~2.docker pull xxxx
docker pull 代表下载镜像,后面是具体的镜像名,第一个是
docker.io是docker仓库的注册表地址,这是官方仓库,可以省略地址;library是命名空间,这里是官方的命名空间,也可以省略不写,同时,如果要是个人上传自己的镜像到仓库,规定要添加自己的命名空间,否则镜像的名字都一样,难以管理;latest是镜像的版本号,如果不写就是默认获取最新的版本号,所以上面的例子最后可以化简为docker pull nginx,表示从官方仓库的官方命名空间下载nginx的最新版本的镜像如果想要搜索一些镜像,可以直接去docker hub网站,免登陆即可使用3.docker images可以获取下载过的镜像,方便管理,如果不使用镜像可以及时删除,避免占用存储
4.docker rmi imageID(rm是remove,i是image)imageID改为你想要删除的镜像ID,我们看上面的那个截图,可以看到每一个镜像都有一个ID,我们可以通过这些ID更方便的管理镜像5.docker rm 容器ID这是删除容器,如果我们要删除运行的容器,还要在rm加上 -f (强制删除)才行6.docker run nginx使用nginx镜像创建并运行容器(其实也可以省略上面的docker pull命令,因为当我们run的时候如果发现没有这个镜像会自动拉取)
7.docker ps查看正在运行的容器,后面再加-a就可以查看所有的容器,无论是否运行
8.docker run -d nginx加一个 -d 可以在后台运行,不会阻塞当前的窗口9.docker run -p xx:xx nginx其中xx是端口号,前面是宿主机的端口,后面是docker的端口,这一步操作是把宿主机的端口和docker的端口绑定,否则无法外部访问10.docker run -d -p 80:80 -v /D:desktop/nginx/html nginx挂载卷,作用是把宿主机
/D:desktop/nginx/html(可替换)文件夹和docker的文件夹绑定,一方修改另外一方也会修改,当docker的容器被删除的时候,数据会保留在宿主机的文件夹内,实现了数据持久化11.docker run -e-e可以用来传递环境变量 比如我们创建一个数据库,肯定要传入用户名和密码,我们就可以这样 ~docker docker run -d -p 13306:13306 \ -e MYSQL_USERNAME=root \ -e MYSQL_PASSWORD=1234 \ MYSQL ~~写好Dockerfile之后就可以开始构建镜像1. 在当前目录执行12.docker run - -name my_nginx nginx这样是给容器起一个独一无二的名字,在宿主机上不能重复。这样的话就可以用起的名字来操作容器(比如rm),不需要容器ID,方便记忆13.docker run -it - -rm alpine-it 是指可以进入容器内进行交互,- -rm是容器停止之后直接删除,一般用来临时调试容器14.docker run -d - -restart always(unless-stopped) nginxrestart指的是重启,always是一直,意思就是容器一停止就重启,unless-stopped也是停止就重启,但是当手动停止之后就不会重启15.docker start(stop)docker start(stop)后面写容器的ID或者名字就可以关闭或者开启容器,docker run是使用镜像制作一个容器,一直docker run就会产生很多的容器,而start和stop就是在原有容器操作的命令,下面的例子就可以看出来了~dockerfileFROM python:3.13-slim //这里的意思是建立一个基础的镜像,我的代码是python的,所以我在python的基础上建立,上面写的slim是一个linux系统,内置了3.13pythonWORKDIR /app //这里的其实类似于cd,后面所有的操作都在这个目录下执行,如果不存在/app目录就自动创建COPY . . //第一个点代表是当前宿主机的目录,第二个点代表镜像内的目录RUN pip install -r requirement.txt //安装依赖,RUN表示要在镜像里面执行EXPOSE 8000 //这里的意思是声明镜像运行的端口是在8000端口,主要是为了给别人使用镜像的时候提醒,实际使用的时候还是以-p为准,这里不写也不会影响程序运行,但是在-p xx:xx里面,右边的xx必须写和程序实际监听的端口一致CMD [“python3”,“main.py”] //CMD 是容器使用的时候的默认启动命令,也就是容器一启动就会执行这个命令,命令最好写成数组的形式,中间不写空格,//ENTRYPOINT[“python3”,“main.py”]这个和CMD 差不多,但是优先级更高,不容易被覆盖16.docker inspect aa8806e32fe0我们在使用一段时间之后可能会忘记容器在启动的时候执行了哪些操作,有没有挂载卷,映射的端口在哪里,我们就可以执行这个操作,然后这个操作会返回一大串数据,我们直接丢给AI让AI分析一下就行
17.docker create -p 80:80 nginxcreate和run都会创建容器,但是不会直接运行容器,手动执行start命令就可以直接运行18.docker logs 容器ID -f不加-f 也可以查看日志,加上-f 就是滚动查看日志,可以看到加上-f 之后光标还在这里闪动,日志会实时更新
19.docker top 容器ID可以在宿主机直接查看容器内部进行的进程,如果我们容器内部的linux环境是精简版,既有可能没有下载一些软件包,如果已经下载了软件包,也可以直接运行
docker exec aa8806e32fe0 ps -ef20.docker exec -it xxxx(容器ID) /bin/sh进入容器内部,获得交互式的吗,命令行环境,很多容器内部都是一个精简的linux操作系统,没有软件包,所以我们如果遇到一些无法执行的命令就得下载一些软件包
## 3. Dockerfile
docker build -t docker_test(这里是镜像的名字,后面还可以选择加一个:写版本号) .(最后写一个点表示在当前目录)2.docker run-d -p 8000:8000 docker_test这样就用我们自己构建的镜像做了一个容器并且运行起来了## 4. 推送镜像到Docker hub1.到Docker hun注册自己的账号2.docker login在cmd输入docker login,登录一下
先输入自己的用户名,然后按住CTRL点击链接
把这个复制之后输入到前面终端的password后面即可,等待,出现Login Successed即可3.docker build -t your_name(这里输入你的用户名)/docker_test现在我们使用Dockerfile重新构建一个镜像,因为在推送镜像的时候必须要写上自己的用户名4.docker push your_name(这里输入你的用户名)/docker_testpush后面是镜像的名字5. 推送成功之后就可以在docker hub上面搜索用户名/镜像名字 来查询
## 5. Docker网络docker网络有两种模式,一种是bridge,一种是host,我们在一般使用的时候使用bridge比较常见,这种就需要做端口映射,docker内部的网络与宿主机的网路是不同的,得通过桥接的方式通信。另外一种host形式可以不需要端口映射,docker的网络直接使用宿主机的网络,这种方式可以解决很多时候出现的网络问题。
在容器内部可以建立子网,子网的开头一般都是172.18,在同一个子网之下的容器,不需要知道容器的ip地址,可以直接通过容器名互相通信,不同的子网则不能互相通信### compose如果一个服务需要启动很多的服务,比如前端程序,后端程序,数据库,那么很显然我们不能将所有的程序都构建在同一个容器之下,这样很容易出现一个服务崩了,其他的服务也跟着遭殃的情况。所以我们很自然的想到可以通过每一个服务就是一个容器的方式实现多容器编排来管理一整个项目,但是手动的去一个指令一个指令的操作容器十分繁琐,所以我们通过编写docker-compose.yml文件可以很好的管理多容器。
左边是手动的去管理多个容器,右边就是使用docker-compose.yml文件管理多容器## 转载声明上述部分截图出自这里,原作者为B站UP主“技术爬爬虾”