docker


一、安装

查看内核

uname -r

更新源

yum -y update

安装依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

设置源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装

yum -y install docker-ce #如有需要可更改安装版本

启动

systemctl start docke
systemctl enable docker #开机自启

二、常见命令

docker run是创建并运行 != docker start

官方文档

官方仓库

拉取Nginx镜像

docker pull nginx

查看当前本地镜像

docker images

image-20231025195639822

保存镜像

docker save -o nginx.tar nginx:latest  # -o 文件名  镜像名:版本号

删除镜像

docker rmi nginx:latest

加载镜像

docker load -i nginx.tar # -i 文件名

运行容器

docker run -d --name nginx -p 80:80 nginx # -d 后台运行并输出容器ID --name 指定名称 主机端口:容器端口 容器名称

image-20231025203058645

出现错误

根据错误提示得知80端口已经被占用,查看80端口情况netstat -ntulp | grep 80,并且此时这个容器并不会运行

解决方案

更换一个没有被占用的端口,8080端口没有被占用,使用8080端口,根据自己需求改变


image-20231025203425577

出现错误

根据错误提示,nginx这个名字已经被占用了,所有创建失败。

解决方案

换一个名字docker ps #查看运行中的容器

成功创建

此时应该有三个容器ID,第一个容器由于端口占用没有成功创建,第二个由于名称占用没有成功创建,但是依旧产生了容器ID,删除这两个没有的容器ID

docker ps -a -q|xargs docker rm  #删除无法运行的容器

关闭运行的镜像

docker stop test

启动运行的镜像

docker start test

查看日志

docker logs test #容器名称

进入容器

docker exec -it nginx bash #-it(说明命令行交互) 容器名 用bash交互

docker模拟了linux的系统root@*** 这个是容器的id

删除容器

docker rm 容器名 -f #运行中的容器不能直接删,-f可以强制删除

设置别名

echo "alias dis='docker images'" >> ~/.bashrc
echo "alias dps='docker ps --format \"table {{.ID}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}\"'" >> ~/.bashrc
source ~/.bashrc #刷新

三、数据卷

案例

进入容器

尝试修改index.html发现没有vi的包,docker的容器虽然模拟了linux,但是也仅仅就是包含了运行nginx必备的包,所以直接在容器内修改是困难的,而数据卷就是容器内目录与宿主机目录之间映射的桥梁(有点类似wsl吗)

数据卷是一个虚拟的目录

命令 说明
docker volume create 创建数据卷
docker volume ls 查看所有的数据卷
docker volume rm 删除指定的数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清楚数据卷

在执行docker run命令的时候使用 -v 数据卷:容器内目录完成数据卷挂载,如果已经创建了容器,就不能进行数据卷挂载

案例实现

创建一个数据卷

docker run -d --name nginx -p 8080:80 -v html:/usr/share/nginx/html nginx

Mountpoint是宿主机的物理地址

此时操作这个宿主机这个目录会同步到容器/usr/share/nginx/html这个目录下

四、本地目录挂载

查看容器详情

docker inspect 容器名

mysql容器在创建的时候会自动的创建一个匿名卷,但是名称过于臃肿,所以最好自己创建一个卷。

本地挂载与数据卷挂载几乎一致,有一点区别

docker run -d --name nginx -p 8080:80 -v html:/usr/share/nginx/html nginx	#数据卷挂载
docker run -d --name nginx -p 8080:80 -v /root/mysql:/usr/share/nginx/html nginx	#本地挂载

主要 区别就在于 -v 的参数,如果直接写html,则就是挂载在/var/lib/docker/volumes的目录下

如是是/root/mysql则是挂载在自己所有指定的目录下

案例实现

#创建一个挂载目录
mkdir -p /root/mysql
#移动到容器的挂载目录
cd /root/mysql
#创建数据、配置、初始化脚本三个挂载目录
mkdir data
mkdir conf
mkdir init
#创建容器并挂载
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/co
nf.d mysql

在创建容器一步如果报错

Error response from daemon: missing signature key

更改docker的版本解决方案

五、自定义镜像

image-20231026115556004

构建镜像

docker build -t myImage:1.0 .	
  • -t 是给镜像起名,格式依然是repository:tag的格式,不指定tag时默认是lastest
  • . 是指定Dockerfile所在目录,如果就在当前目录,则指定位”.”

部署go工程

编写源程序,在当前目录创建Dockerfile

vi Dockerfile
#依赖镜像(母镜像),可以先使用docker search命令搜索
FROM golang:latest

#Docker工作目录
WORKDIR $GOPATH/src/go-docker

#将当前目录添加到Docker
ADD . $GOPATH/src/go-docker

#在Docker工作目录下执行命令
RUN go build main.go

#暴露端口
EXPOSE 9090

#编译后在根目录下生成而非./core目录下,最终运行Docker的初始命令
ENTRYPOINT ["./main"]

构建镜像

docker build -t go-docker .

由于使用是国内的云服务器无法访问github,这里就运行失败了。

新建一个简单的测试

mkdir test
cd test
vi test.go
package main

import (
   "log"
   "net/http"
)

func main() {
   http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
      w.Write([]byte("Hello Docker"))
   })
   log.Println("go docker project is running...")
   http.ListenAndServe(":9090", nil)
}
vi Dockerfile
#依赖镜像(母镜像),可以先使用docker search命令搜索
FROM golang:latest

#Docker工作目录
WORKDIR $GOPATH/src/go-docker

#将当前目录添加到Docker
ADD . $GOPATH/src/go-docker

#在Docker工作目录下执行命令
RUN go build test.go

#暴露端口
EXPOSE 9090

#编译后在根目录下生成而非./core目录下,最终运行Docker的初始命令
ENTRYPOINT ["./test"]

成功创建

运行容器

docker run -d --name test -p 9090:9090 go-docker

测试访问

curl http://127.0.0.1:9090

输出hello docker即成功

六、容器网络

默认情况下,所有容器都以bridge方式连接到Docker的一个虚拟网桥

如果直接通过IP通信,由于容器是虚拟的网桥,所以每次运行容器的时候改容器的IP可能发生改变

使用自定网络的容器可以通过容器名相互访问

命令 说名
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定的网络
docker network prune 清楚没有使用的网络
docker network connect 使指定的容器加入某个网络
docker network disconnect 使指定的容器离开某个网络
docker network inspect 查看网络详细信息

DockerCompose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

yml文件的格式与docker run中的命令基本相对应

细节详情


文章作者: zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhang !
  目录