docker install

Install Docker Engine on CentOS
注意系统环境:
To install Docker Engine, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.

docker images

ssh root@121.89.167.190

command

  1. docker images
  2. -a, --all Show all images (default hides intermediate images)
  3. -q, Only show numeric IDs
  4. docker search mysql
  5. docker pull mysql:latest (联合文件系统, 公用的可通用,不用再重新下载)
  6. # docker rm0 -f 3d65b4f0723b 2ae23eb477aa
  7. # docker rmi -f $(docker images -aq)

nginx

  1. mkdir -p /data/docker/nginx/{conf,logs,html}
  2. docker exec -it `docker ps -a | grep jx_nginx | awk '{print $1}'` /usr/sbin/nginx -s reload
  3. docker run --name bee-nginx -d -p 8080:80 nginx
  4. docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro nginx
  5. # 自定义挂载配置
  6. docker run --name some-nginx -v /data/docker/nginx/html/:/usr/share/nginx/html:ro -v /data/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -d -p 8080:80 nginx
  7. # https
  8. docker run --name jx_nginx -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/html/:/usr/share/nginx/html -v $PWD/certs/:/etc/nginx/cert/ -p 8080:80 -p 443:443 -d nginx
  9. https://wx.3bule.com


nginx 基础配置**

mysql

  1. docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
  2. docker run --name jx_mysql -e MYSQL_ROOT_PASSWORD=Li763a7689 -d -i -p 3306:33060 mysql
  3. docker exec -it `docker ps -a | grep some-mysql | awk '{print $1}'` bash
  4. docker ps -a | grep mysql
  5. docker exec -it some-mysql bash
  6. docker run -d -p 3306:3306 -v /data/soft/mysql:/etc/mysql/conf.d -v /data/soft/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Li763a7689 -d --name jx_mysql mysql

查看容器中的mysql配置:The default configuration for MySQL can be found in /etc/mysql/my.cnf

  1. cat /etc/mysql/my.cnf
  2. [mysqld]
  3. pid-file = /var/run/mysqld/mysqld.pid
  4. socket = /var/run/mysqld/mysqld.sock
  5. datadir = /var/lib/mysql
  6. secure-file-priv= NULL
  1. docker run -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0
  2. # -p 将本地主机的端口映射到docker容器端口
  3. # --name 容器名称命名
  4. # -e 配置信息 配置root密码
  5. # -d 镜像名称

docker container

  1. docker run [images] 启动镜像
  2. --name 容器名字
  3. -d 后台方式运行
  4. -it 使用交互方式运行,进入容器查看内容
  5. -p 指定容器端口 主机端口映射到容器端口 80:8080
docker ps 
docker pa -a 

# 删除指定容器
docker rm  容器id

# 删除正在运行的容器
docker rm -f 容器id

# 删除所有容器
docker rm -f $(docker ps -aq)
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id

容器使用后台运行,就必须要有一个前台进程

# 显示指定行数的日志
docker logs -tf --tail 10 容器

进入容器

docker exec -it 容器id bash

# 打开新的终端
docker attch -it 容器id bash

docker exec # 进入容器后开启一个新的终端
docker attach # 进入容器正在执行的终端,不会启动新的进程

从容器内拷贝到主机

docker cp 容器id:/home/test.txt

Docker 镜像加载

UnionFS(联合文件系统): Union文件系统

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

容器数据卷

容器之间数据共享技术,Docker容器中产生的数据,同步到本地
将容器内的目录挂载到本地

docker run -it -v 主机目录,容器目录

docker inspect 容器id

具名挂载: docker run -d -p —name nginx_01 -v /etc/nginx nginx

Dockerfile

使用gin, 新建一个简单的golang web项目

构建
docker build .
-f 指定文件 -t 指定镜像名 name:tag
docker build . -t bee:lastest
docker build -f Dockerfile -t jx_centos:01 .

CMD 和 ENTRYPOINT 区别
CMD: 只有最后一个生效
FROM centos
CMD [“ls”, “a”] 想追加一个命令 docker run 容器id -l因为CMD是替换,所以会报错

ENTRYPOINT:
FROM centos
ENTRYPOINT [“ls”, “a] 这个是追加命令,是直接追加到ENTRYPOINT之后的

docker compose

Overview of Docker Compose
Dockerfile 让程序运行在任何地方, web服务。 redis mysql nginx …多个容器 一组容器
service: 一个应用的容器, 可以包含若干运行相同镜像的容器实例
project: 一组关联的应用容器

version: '2.0'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker compose install

curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

docker-compose up

练习

第一个简单项目: 我的golang

FROM golang:alpine as builder

ENV GOPROXY https://goproxy.io,https://goproxy.cn,direct
ENV GO111MODULE on
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

WORKDIR /app

ADD go.mod .
ADD go.sum .
RUN go mod download

COPY . /app

RUN go build .

EXPOSE 8888:8888

ENTRYPOINT ["./lunch"]
docker build . -t bee:lastest
docker run --name jx_bee -d -p 80:8080 bee:lastest

gin代码写的是8080端口, Dockerfile 8888:8888端口 ,启动的容器是
5a2e37d3f7ab bee:lastest “./app” 0.0.0.0:8888->8888/tcp jx_bee
所以就没访问到,要保证可以访问到容器内,该代码启动的端口

linux command


cd /data/soft/web/bee-admin/ServiceSide/bee/
cat docker-compose.yaml
curl "http://127.0.0.1/hb/user/getUserList"

docker-compose --compatibility ps
docker-compose --compatibility up
docker-compose --compatibility up -d
docker-compose --compatibility stop

docker ps -a

mkdir -p /data/docker/mysql/etc && cd /data/docker/mysql
cat >> /data/docker/mysql/etc/my.cnf <<-EOF

# 从容器中拷贝文件
 docker cp 容器id:/etc/nginx/conf.d /root/echo_1/conf.d

问题

1.启动容器失败的,可以查看下日志:
docker logs -f -t —tail 400 jx_nginx
docker logs 容器id

2.nginx https: 配置时
报错: cannot load certificate “/etc/nginx/certs/wx.3bule.com.pem”
挂载的数据卷: $PWD/certs/:/etc/nginx/cert/
nginx配置
ssl_certificate /etc/nginx/certs/wx.3bule.com.pem;
ssl_certificate_key /etc/nginx/certs/wx.3bule.com.key;
所以把nginx配置certs -> cert

3.容器启动失败
docker insepct 容器id

"State": {
  "Status": "exited",
  "Running": false,
  "Paused": false,
  "Restarting": false,
  "OOMKilled": false,
  "Dead": false,
  "Pid": 0,
  "ExitCode": 1,
  "Error": "",
  "StartedAt": "2020-11-26T01:34:51.131612125Z",
  "FinishedAt": "2020-11-26T01:34:51.334779125Z"
},

参考链接

将Golang应用部署到Docker
Dockerfile 指令详解