Docker操作指南

· 2360字 · 5分钟

安装 🔗

Ubuntu安装Docker 🔗

安装一些必要的系统工具 🔗

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

安装GPG证书 🔗

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写入软件源信息 🔗

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新并安装docker-CE 🔗

sudo apt-get -y update
sudo apt-get -y install docker-ce

启动Docker 🔗

systemctl enable docker
systemctl start docker

问题 🔗

启动docker,运行命令遇到问题 dial unix /var/run/docker.sock: permission denied.Are you trying to connect to a TLS-enabled

创建docker用户组 🔗
sudo groupadd docker
把当前用户加入docker用户组 🔗
sudo gpasswd -a ${USER} docker
更新用户组 🔗
newgrp docker
查看是否添加成功 🔗
cat /etc/group | grep ^docker
重启docker 🔗
sudo service docker restart

镜像 🔗

使用阿里云镜像加速 🔗

sudo vim /etc/docker/daemon.json
添加:
{
  "registry-mirrors": ["https://xs4sxa1w.mirror.aliyuncs.com"]
}
保存退出

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker生成镜像 🔗

1. 创建名称为 zhang/order 的镜像
2. 版本(Tag)为 v0.1
docker build -t zhang/order:v0.1 .

Docker查看镜像 🔗

docker images

Docker删除镜像 🔗

1.删除镜像ID为 123456 的镜像
docker rmi 123456
2.删除无用镜像
docker rmi $(docker images -f "dangling=true" -q)
3.删除虚悬镜像
docker image prune
3.根据条件批量删除
// 删除带有 xxxy 的 镜像
docker rmi $(docker images | grep "xxxy" | awk '{print $3}')

容器 🔗

创建容器 🔗

1. -d 后台运行
2. -p 8080:8080 端口映射,前面的8080宿主机的端口,后面的8080容器里面的端口
3. --network mynet 运行在mynet的网络上
4. --name 容器名称
5. zhang/order:v0.1 镜像名称加Tag
docker run -d -p 8080:8080 --network mynet --name api zhang/order:v0.1

查看容器 🔗

1. 查看运行中的容器
docker ps
2. 查看全部容器
docker ps -a
3. 进入容器查看信息(xxxx容器名称或容器ID)
docker exec -it xxxx /bin/bash
docker exec -it xxxx /bin/sh
4. 查看容器日志
docker logs xxxx
5. 一直打印日志
docker logs --follow
6. 停止容器
docker stop xxxx
7. 重启容器
docker restart xxxx

删除容器 🔗

1. 删除停止的容器(api容器名称)
docker rm api
2. 删除运行中的容器(api容器名称)
docker rm -f api
3. 删除全部容器
docker rm $(docker ps -aq)

自动重启容器 🔗

1.对刚开始创建的容器
--restart=always 在容器退出时总是重启
--restart=on-failure 在容器非正常退出(代码不等于0)时重启
--restart=on-failure:10 在容器非正常退出(代码不等于0)时重启10次
docker run -d \
    -p 8080:8080 \
    --network mynet \
    --restart=always \
    --name api \
    zhang/order:v0.1
    
2.对已经运行的容器(api=容器名称)
docker update --restart=on-failure:10 api

3.查看容器启动次数
docker inspect -f "{{ .RestartCount }}" api

3.查看容器最后一次启动时间
docker inspect -f "{{ .State.StartedAt }}" api

网络 🔗

创建网络 🔗

docker network create baoli-networks

查看网络 🔗

1. 查看一个网络
docker network inspect mynet
2. 查看容器的网络
docker inspect ordering

连接网络 🔗

docker network connect mynet ordering

数据 🔗

拷贝数据 🔗

1. 从容器拷贝到宿主机
docker cp [容器Id]:/[dockerfile最后目录] e:/web/test
2. 从宿主机拷贝到容器
docker cp /home/www [容器Id]:/[dockerfile最后目录]

数据挂载 🔗

注意:官方的建议是挂载文件夹,而不是文件。如果确实需要挂载文件,宿主机提前创建好文件
1. -v /home/www/prod_order_api/log:/app/log 文件夹挂载
2. -v /home/www/prod_order_api/app.yaml:/app/app.yaml 文件挂载,需要在对应宿主机创建文件
2. -v /home/www/prod_order_api/ip2region.db:/app/ip2region.db 文件挂载,需要在对应宿主机创建文件
docker run -d -p 50000:50000 -v /home/www/prod_order_api/log:/app/log -v /home/www/prod_order_api/app.yaml:/app/app.yaml -v /home/www/prod_order_api/ip2region.db:/app/ip2region.db --name orderAPI baoli/order:v0.1

自定义镜像 🔗

中国时区的alpine镜像 🔗

FROM alpine:3.16
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk update --no-cache  \
    && apk add --no-cache ca-certificates tzdata curl
ENV TZ=Asia/Shanghai
CMD ["/bin/bash"]

2. 构建镜像
docker build -t zc1185230223/alpine:3.16.1 .
--3. tag
docker tag alpine-hk zc1185230223/alpine:3.16.1
4. 推送镜像
docker push zc1185230223/alpine:3.16.1

Dockerfile 🔗

GO应用程序Dockerfile 🔗

分阶段构建镜像 🔗

# Build Stage
FROM golang:1.16-alpine AS builder
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN go build -o main main.go

# Run Stage
# FROM alpine
# 使用自定义的alpine,香港时区
FROM zc1185230223/alpine-hk
WORKDIR /app
COPY --from=builder /app/main .
COPY --from=builder /app/app.yaml .
COPY --from=builder /app/ip2region.db .

EXPOSE 50000
CMD ["/app/main"]

直接使用编译好的程序 🔗

# 使用scratch(这个基础镜像会进入不了容器,最好用使用自定义的alpine [zc1185230223/alpine-hk])
# 构建镜像前,需要编译程序
# CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o go-doc-api .
FROM scratch
WORKDIR /app
COPY . /app
EXPOSE 9201
ENTRYPOINT ["./go-doc-api"]

ASP.NET CORE Dockerfile 🔗

Docker安装MYSQL服务 🔗

下载Mysql 🔗

docker pull mysql

目录创建 🔗

在主目录(和home同目录) 创建/mysql/conf /mysql/logs /mysql/data 3个文件夹

mkdir -p ~/mysql/conf ~/mysql/logs ~/mysql/data

在conf中创建文件 my.cnf 并写入[注意:每行后面不要有空格] 🔗

cd mysql/conf
sudo vim my.cnf

[mysqld]
user=mysql
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

使用已有网络或者创建一个新的或者不用(可以省略) 🔗

docker network create mynet

运行mysql镜像 🔗

终端进入刚刚创建的mysql文件夹(如果有创建网络)

docker run -d -p 3306:3306 \
    -e MYSQL_USER='hulk' \
    -e MYSQL_PASSWORD='pwd123' \
    -e MYSQL_ROOT_PASSWORD='root' \
    -e MYSQL_ROOT_HOST=% \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    --network mynet \
    --name betamysql mysql

进入mysql容器 🔗

初始密码为:root

docker exec -it betamysql bash
mysql -uroot -p # 回车后输入数据库密码

查看用户信息 🔗

备注:host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码

select host,user,plugin,authentication_string from mysql.user;

修改用户密码 🔗

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'hulk'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';

对用户授权(全部授权) 🔗

# 查看权限
show grants for hulk;
grant all on *.* to 'hulk'@'%';
flush privileges;

Docker-componse安装 🔗

官网文档

安装 docker-compose 🔗

在线 🔗

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

离线 🔗

下载离线包(linux 64位)  GitHub下载
将下载的compose文件 “docker-compose-Linux-x86_64“ 改名为 “docker-compose”,移动到 /usr/local/bin

sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

添加可执行权限

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

删除 docker-compose 🔗

sudo rm /usr/local/bin/docker-compose
// 上面的不行,就执行下面的
sudo ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

生成镜像 🔗

docker-compose build

运行 🔗

docker-compose up
#后台运行
docker-compose up -d

停止 🔗

docker-compose down
#-v:删除挂载卷和volunme的链接
docker-compose down -v

容器扩容 🔗

# user_rpc: docker-compse 服务
# 5 扩容个数
# 注意:扩容的服务不能定义容器名称
docker-compose up -d --scale user_rpc=5

Docker推送镜像到腾讯云 🔗

登录腾讯云镜像是需要安装软件 🔗

https://blog.51cto.com/u_14832233/4057916
sudo apt install gnupg2 pass
gpg2 --full-generate-key

登录腾讯hub 🔗

sudo docker login --username=zc1185230223 hub.tencentyun.com
docker login --username=37149283 ccr.ccs.tencentyun.com
System159753!#

给镜像打Tag 🔗

sudo docker tag 镜像Id hub.tencentyun.com/zc1185230223/自定义镜像名称:tag
docker tag 镜像Id ccr.ccs.tencentyun.com/cn.btx/xxx:tag

推送 🔗

sudo docker push hub.tencentyun.com/zc1185230223/自定义镜像名称:tag

获取镜像 🔗

服务器pull镜像时,登录失败
Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`
执行下面的命令
sudo apt install gnupg2 pass

Docker安装POSTGRES服务 🔗

docker run --name postgres16 \
--network proxy \
-p 10924:5432 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=zc920328 \
-v /home/kenneth/services/postgres/data:/var/lib/postgresql/data \
-d postgres:16-alpine