一、安装
查看内核
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
保存镜像
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 指定名称 主机端口:容器端口 容器名称
出现错误
根据错误提示得知80端口已经被占用,查看80端口情况netstat -ntulp | grep 80
,并且此时这个容器并不会运行
解决方案
更换一个没有被占用的端口,8080端口没有被占用,使用8080端口,根据自己需求改变
出现错误
根据错误提示,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的版本解决方案
五、自定义镜像
构建镜像
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中的命令基本相对应