Docker

70 阅读9分钟

Docker基础

一、安装和卸载

安装Docker

1.卸载旧内容

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

2.安装yum工具

sudo yum install -y yum-utils

3.设置镜像源

sudo yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

4.安装Docker

sudo yum install docker-ce docker-ce-cli containerd.io

5.启动Docker

sudo systemctl start docker

6.查看Docker版本

docker --version

如果显示docker的版本信息即代表安装成功

卸载Docker

1.卸载依赖

sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

2.删除工作路径

sudo rm -rf /var/lib/docker

3.删除容器路径

sudo rm -rf /var/lib/containerd

二、Docker命令

官方文档命令地址:docs.docker.com/engine/refe…

1.系统命令

docker的系统信息

docker info

停止docker

systemctl stop docker

docker命令列表

docker --help 

查看"xxx"命令的作用

docker xxx --help

2.镜像命令

查看镜像

查看镜像

docker images

列出所有的镜像

docker images -a

列出所有镜像的id

docker images -aq
搜索镜像

搜索镜像

docker search 镜像名

搜索stars数大于3000的xxx镜像

docker search 镜像名 --filter=STARS=3000
下载镜像

下载镜像

docker pull 镜像名

不加版本时默认latest版本

等价于:docker pull docker.io/library/mysql:latest (:latest表示最新版本)

下载指定版本镜像

docker pull 镜像名:版本

等价于:docker pull docker.io/library/mysql:2.0 (:2.0表示2.0版本)

删除镜像

删除镜像

docker rmi -f 镜像id

删除多个镜像

docker rmi -f 镜像id1 镜像id2 镜像id3

删除所有镜像

docker rmi -f $(docker images -aq)

$(docker images -aq):列出所有镜像id

3.容器命令

启动容器

启动容器

docker run -d 镜像名:镜像版本

启动已存在的容器

docker start 容器名或容器id

重启容器

docker restart 容器名或容器id

启动并进入容器

docker run -it 镜像名:镜像版本 /bin/bash 
docker run 参数说明
--name 容器名			// 设置容器名 用来区分容器
-d			// 后台方式运行
-it			// 使用交互方式运行,进入容器查看内容
-P			// 大写p 随机端口运行
-p 主机端口:容器端口			// 小写p,指定端口运行
查看容器

列出当前运行的容器

docker ps
docker container ls

列出所有容器

docker ps -a

列出所有容器的id

docker ps -q
停止容器

停止正在运行的容器

docker stop 容器名或容器id

强制停止正在运行的容器

docker kill 容器名或容器id
删除容器

删除容器(不能删除正在运行的容器)

docker rm 容器名或容器id

删除容器(包括正在运行的容器)

docker rm -f 容器名或容器id

删除所有容器(包括正在运行的容器)

docker rm -f $(docker ps -aq)

4.常用命令

详细信息

容器详细信息

docker inspect 容器名或容器id

容器在宿主机的目录

/var/lib/docker/containers/
日志

查看容器所有日志

docker logs -tf 容器名或容器id

查看容器最近的10条日志

docker logs -tf --tail 10 容器名或容器id
进程

查看容器的进程信息

docker top 容器名或容器id
进入容器

创建新终端进入

docker exec -it 容器名或容器id /bin/bash
docker exec -it 容器名或容器id /bin/sh

不创建新终端进入

docker attach 容器名或容器id

root权限进入

docker exec -u 0 -it 容器名或容器id sh
docker exec -it --user=root 容器名或容器id /bin/bash
文件拷贝

容器中拷贝到主机(将容器中的home目录下的"xxx.go"文件 拷贝到主机"home/go"目录中)

docker cp 容器名或id:/home/xxx.go home/go

宿主机拷贝到容器(将主机当前目录下的"xxx.go"文件拷贝到主机"/data/themes"目录中)

docker cp xxx.go 容器名或id:/data/themes/
镜像复制

复制镜像"centos:1.0" ,并将复制后的新镜像命名为"vczs/mycentos:2.0"

docker tag centos:1.0 vczs/mycentos:2.0

Docker进阶

一、DockerVolume

概念

引出

1.我们的数据都在容器中,如果容器删除,数据就丢失。
2.需要一种技术可以将容器中的数据同步并存储到本地,让数据持久化。

作用

1.容器数据卷有一个数据共享的技术:docker容器中产生的数据,同步并存储到本地。
2.这就是卷技术,目录的挂载,将我们容器内的目录,挂载到主机上。

注意项

1.修改容器内文件时只需在本主机修改对应挂载文件即可,容器内会自动同步。
2.容器间也是可以数据共享的,即多个容器挂载到同一个主机目录下。

总结

容器数据的持久化和同步操作。

命令

创建

创建一个容器卷

docker volume create 卷名
查看

查看所有容器卷

docker volume ls

查看指定容器卷详情

docker volume inspect 卷名
使用

指定挂载(常用)

docker run -v 主机目录:容器内目录

具名挂载:不写主机目录,只写容器卷名,让容器具名挂载到容器卷中。(容器卷不存在会自动创建)

docker run -v 卷名:容器目录

匿名挂载:不写主机目录或容器卷名,让容器内目录匿名挂载到主机。(容器卷docker自动生成)

docker run -v 容器内目录

继承挂载(不常用):容器c2继承容器c1的挂载配置

docker run c2 --volumes-from c1

ps:匿名挂载和具名挂载的目录都在主机的"/var/lib/docker/volumes/xxx/_data"路径下

权限

只读容器卷(此时这个路径只能通过宿主机操作 容器内部无法操作)

docker run -v 主机目录或卷名:容器内目录:ro

可读可写容器卷

docker run -v 主机目录或卷名:容器内目录:rw

二、DockerNetwork

查看容器ip

查看指定容器ip

docker exec -it 容器名 ip addr

容器内查看当前ip

ip addr

link命令

入门

1.连通容器网络(容器B必须已存在)

docker run -d --name 容器A名 --link 容器B名 镜像名:版本

2.测试

docker exec -it 容器A名 ping 容器B名
docker exec -it 容器B名 ping 容器A名

3.此时在容器A里可以ping通容器B,在容器B里可以ping通容器A,两个容器可以互相ping通。

原理

1.分析:进入容器B查看hosts文件

docker exec -it 容器B名 cat /etc/hosts

2.结论

"--link"命令就是在容器hosts配置文件中增加了其他容器的ip映射

ps:这种方式不建议使用 太过死板

自定义网络(推荐)

自定义一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
参数说明:
    --driver bridge			// 网络模式,基于默认网络模式bridge
    --subnet 192.168.0.0/16			// 子网地址,支持192.168.0.2到192.168.255.255
    --gateway 192.168.0.1			// 网关,即路由器地址
    mynet			// 自定义网络模式名
删除自定义网络
docker network rm 网络名
查看网络

查看所有网络模式

docker network ls
网络模式:
    bridge:桥接模式(默认模式)
    none:不配置网络
    host:和主机共享

查看指定网络模式详情

docker network inspect 网络模式名
使用方法

指定容器的网络模式

 docker run -d --name 容器名 --net 网络模式 镜像名:版本
创建容器不指定网络模式时默认使用bridge模式,会自动添加"--net bridge"。
我们自定义的网络模式已经帮我们维护好了对应的关系,推荐开发中使用自定义网络模式。

容器加入指定网络模式

docker network connect 网络模式 容器名或容器id

三、DockerHub

生成镜像

容器生成新镜像

1.容器生成镜像

docker commit -m=描述 -a=用户名 容器id 新镜像名:版本

2.为镜像打tag,必须打tag,否则镜像无法push。打tag时会生成一个新镜像。

docker tag  镜像名:版本  用户名/镜像名:版本
旧镜像生成新镜像

1.下载镜像(本机已存在目标镜像则跳过)

docker pull 原用户名/原镜像名:版本

2.为镜像打tag,打tag时会生成一个新镜像。

docker tag  原用户名/原镜像名:版本  用户名/镜像名:版本

发布镜像

1.注册账号:DockerHub官网注册账号:hub.docker.com/ (已有账号则跳过)

2.登陆账户

docker login -u 用户名

3.发布镜像,提交镜像到DockerHub

docker push 用户名/镜像名:版本

ps:提交镜像时必须在镜像名前加上自己dockerhub的用户名,否则提交错误。

四、拓展

离线镜像

镜像转文件

docker save 镜像名 > /root/image.tar 

文件转镜像

docker load < /root/image.tar
docker load -i /root/image.tar

可视化

Docker可视化界面:运行以下命令无报错后可在浏览器输入”主机地址:8080“访问Docker可视化界面

docker run -d -p 8080:9000 \
--ressart=always -v /var/run/docker.sock --privileged=true portainer/portainer

Docker高级

一、dockerFile

(一)入门

1.创建一个dockerfile文件,文件名可自定义。

2.编写dockerfile文件内容,指定命令全部为大写。

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---上面为匿名挂载---"
CMD /bin/bash

3.将dockerfile构建为一个docker镜像。

docker build -f /dockerfile -t 镜像名:版本

4.运行镜像。

docker run -d --name 容器名 镜像名:版本

(二)常用指令

FROM		 # 基础镜像 一切从这里开始
MAINTAINER	  # 镜像作者
RUN			 # 镜像构建的时候需要运行的命令
ADD			 # 步骤 添加内容
WORKDIR		 # 镜像的工作目录
VOLUME		 # 挂载的目录
EXPOSE		 # 保留端口配置
CMD			 # 指定这个容器启动时运行的命令 只有最后一个命令生效 可被覆盖
ENTRYPOINT    # 指定这个容器启动时运行的命令 可以追加
ONBUILD		 # 构建一个被继承dockerFile
COPY		 # 将文件拷贝到镜像中 类似ADD
ENV			 # 构建时设置环境变量

(三)常用命令

1.查看镜像的构建过程

docker history 镜像id

(四)实战案例

构建一个centos镜像

1.进入home文件夹创建一个dockerFile文件夹

mkdir dockerFile

2.在dockerFile文件夹下创建并编写myDockerFile文件

vi myDockerFile

3.编写mydockerfile文件内容

FROM centos   		   # 镜像内核使用centos最新版
MAINTAINER  tombkeeper  # 镜像作者
ENV MYPATH /usr/local   # 设置环境变量MYPATH
WORKDIR $MYPATH		    # 设置工作路径为环境变量路径
RUN yum -y install vim   # 给镜像下载vim工具
RUN yum -y install net-tools # 给镜像下载net-tools工具
EXPOSE 80  	# 暴露80端口
CMD echo $MYPATH  # 启动时运行$MYPATH
CMD echo "---end---"  # 启动时运行"---end---"
CMD echo /bin/bash    # 启动时运行/bin/bash

4.使用myDockerFile文件构建myCentos镜像

docker build -f myDockerFile -t myCentos:1.0 .

ps:如果myDockerFile文件名为Dockerfile(官方命名),那么在构建时就无需使用-f指定,docker会自动续找名为Dockerfile的文件。

5.使用myCentos镜像运行容器

docker run -p 8080:80 --name myCentos -d myCentos:1.0
构建一个tomcat镜像

1.进入honme文件夹创建一个dockerFile文件夹

mkdir dockerFile

2.在dockerFile文件夹下创建并编写myTomcat文件

vi tomcatDockerFile

3.编写Dockerfile文件内容

FROM centos
MAINTAINER tombkeeper
COPY readme.txt /usr/local/readme.txt
ADD jdk-16.0.1_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-8.5.69-deployer.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk16.0.1
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.69
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.69/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.69/bin/logs/catalina.out

4.使用tomcatDockerFile文件构建myTomcat镜像

docker build -f tomcatDockerFile -t myTomcat:1.0 .

5.使用tomcat镜像运行容器

docker run -p 9090:8080 --name tomcat01 -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.69/webapps/test -v /home/tomcat/logs:/usr/local/apache-tomcat-8.5.69/logs -d myTomcat

二、DockerCompose

(一)安装

1.下载安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.配置权限

sudo chmod +x /usr/local/bin/docker-compose

3.查看安装结果

docker-compose version

ps:如果显示版本信息即代表安装成功。

(二)卸载

1.卸载DockerCompose

sudo rm /usr/local/bin/docker-compose

(三)实例:GO程序上线

1.在/home目录下创建my_go文件夹

mkdir /home/my_go

2.进入my_go目录

cd /home/my_go

3.创建main.go文件

vim main.go

3.编写main.go文件内容

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello Golang")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":80", nil)
}

4.创建Dockerfile文件

vim Dockerfile

5.编写Dockerfile文件内容

FROM golang
LABEL maintainer="vczs"
WORKDIR $GOPATH/src/godocker
ADD . $GOPATH/src/godocker
RUN go build main.go
EXPOSE 80
ENTRYPOINT ["./main"]

6.创建"docker-compose.yml"文件

vim docker-compose.yml

7.编写"docker-compose.yml"文件内容

version: '3.8'
services: 
    mygos:
        build: .
        image: mygos
# yaml文件规则
# 参考:https://docs.docker.com/compose/compose-file/compose-file-v3/

8.在/home/my_go目录下使用 "main.go" "Dockerfile" "docker-compose.yml" 三个文件启动程序

docker-compose up --build

9.在主机上检查是否可以访问

curl localhost:8080

10.如果主机上可以访问,此时就可以在本地浏览器输入"ip:8080"访问我们的GO程序。(服务器要开放8080端口)

三、DockerSwarm

(一)入门

1.背景:有至少四台或更多台服务器,要将这些服务器组成一个集群。

2.设置A为主节点(在A服务器上执行)

docker swarm init --advertise-addr A主机ip

3.获取管理身份节点token(只能在主节点获取)

docker swarm join-token manager

4.获取工作身份节点token(只能在主节点获取)

docker swarm join-token worker

5.3和4步骤都会获取一个对应身份的token;其他节点若要加入集群,只需在其终端执行要加入的身份(管理和工作)的token即可。

6.至此集群搭建成功,后续有新服务器要加入集群只需执行token加入即可。

ps:集群主节点应该最少三台;如果双主,其中一个主节点宕机停止,另外一个主节点也不能使用(Raft协议选举规则:最后一个主节点不能自己选举自己)。

(二)常用命令

查看集群节点列表(只能在管理节点查看)

docker node ls

当前主机离开集群

docker swar

Docker实战

一、运行Nginx容器

1.搜索镜像

docker search nginx

2.下载镜像

docker pull nginx

3.运行容器

docker run -d --name nginx01 -p 3355:80 nginx

4.此时就可以在外网通过"主机ip:3355"来访问nginx容器

二、运行tomcat容器

1.搜索镜像

docker search tomcat

2.下载镜像

docker pull tomcat

3.运行容器

docker run -d --name tomcat01 -p 3377:8080 tomcat

4.进入容器

docker exec -it tomcat01 /bin/bash

5.将webapps.dist里的所有文件拷贝到webapps文件夹 。(tomcat配置不完整,webapps文件夹里没有部署可运行的文件。)

cp -r webapps.dist/* webapps

6.此时就可以在外网通过"主机ip:3377"来访问nginx容器

三、运行MySQL容器

(一)运行容器

1.搜索镜像

docker search mysql

2.下载镜像

docker pull mysql

3.启动mysql并挂载需要的容器目录到主机

docker run -p 3306:3306 --name mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

4.使用第三方mysql工具连接“ip地址:3306”即可连接mysql

(二)常见问题解决方法

mysql容器自动停止

1.进入与"/etc/mysql/conf.d"挂载的目录,并创建docker.cnf文件。

vi docker.cnf

2.在docker.cnf文件添加如下内容 然后保存退出

performance_schema_max_table_instances=400  
table_definition_cache=400  
table_open_cache=256
performance_schema = off

3.重启容器

docker start mysql

四、运行go容器

1.在home/go目录下创建main.go

vi /home/go/main.go

2.编写main.go内容

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello Golang")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

3.在home/go目录下创建Dockerfile文件

vi /home/go/Dockerfile

4.编写Dockerfile内容

# 使用Golang基础镜像
FROM golang:latest
# 设置工作目录
WORKDIR /app
# 复制应用程序代码到容器中
COPY . .
# 构建Go应用程序
RUN go build -o app
# 暴露端口
EXPOSE 8080
# 运行应用程序
CMD ["./app"]

5.进入/home/go目录,使用 "main.go" 和 "Dockerfile" 文件构建镜像。

docker build -t go-app .

6.运行容器

docker run -d -p 8080:8080 --name my-go-app go-app

7.在主机上检查是否可以访问

curl localhost:8080

8.若主机上可以访问,此时就可以在本地浏览器输入"ip:80"访问我们的go项目。(服务器要开放8080端口)

五、运行开源博客

(一)方法一

1.自定义一个网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

2.运行mysql容器

docker run -p 3306:3306 --name blog-mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --net mynet mysql:5.7

3.运行wordpress博客容器

docker run -d --name myblog01 -e WORDPRESS_DB_HOST=blog-mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123456 -e WORDPRESS_DB_NAME=blog_db -p 80:80 -p 443:443 --net mynet wordpress
环境变量解释:
WORDPRESS_DB_HOST:数据库地址,填mysql容器名(mysql容器要和开源博客容器在同一个网络模式下,互相可ping通。)
WORDPRESS_DB_USER:mysql用户名,默认root
WORDPRESS_DB_PASSWORD:mysql密码
WORDPRESS_DB_NAME:数据库名

4.浏览器输入“ip:端口”访问并设置个人博客。(请提前在mysql中创建好开源博客的数据库)

5.个人博客搭建成功。

(一)方法二

1.在/home目录下创建一个文件夹,文件名可自定义。

mkdir /home/my_wordpress

2.进入刚创建的空目录

cd /home/my_wordpress

3.创建"docker-compose.yml"文件

vim docker-compose.yml

4.添加"docker-compose.yml"文件内容

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

5.运行项目

docker-compose up

6.个人博客搭建成功。

7.停止项目

docker-compose down

其他

typecho博客

1.自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

2.运行mysql容器

docker run -p 3306:3306 --name blog-mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=sun123MM -d --net mynet mysql:5.7

3.运行typecho证书

带证书

docker run -dit -p 80:80 -p 443:443 --name blog -e DOMAIN="vczs.top" -v /home/cert:/etc/nginx/cert vczs/typecho_ssl
"/home/cert"存放证书和密钥
重命名证书和密钥为: typecho.pem 及 typecho.key

不带证书

docker run -d -p 80:80 --name blog --net mynet 80x86/typecho