docker基本命令

Docker基础命令

  PS:  在以下命令中要注意下面5个名字代表的含义

     1. imageId: 镜像ID

     2. imageName: 镜像名字

     3. containerId:  容器ID

     4. containerName: 容器名字

     5. fileName: 文件名

  • 安装docker

yum install docker
  • 查看是否安装成功

docker info 
# 或者
docker version
  • 换源 

  vi /etc/docker/daemon.json
  # 增加
 {
    "registry-mirrors": ["https://3zfwxe4j.mirror.aliyuncs.com"]
  }
 # 重启
  systemctl restart docker
  • 登录dockerHub

docker login docker.io
  • 查找镜像
docker search imageName(镜像名)
  • 下载镜像
docker pull imageName(镜像名)
  • 上传镜像

docker push docker.io/username/imageName(镜像名)
  • 改镜像名

docker tag imageId(镜像id) docker.io/zhengquantao/imageName(新镜像名)
  • 查看镜像

docker images
  • 查看所有容器名

# 查看正在运行容器
docker ps
# 查看所有容器,包含停止的容器
docker ps -a
  • 运行容器

# 运行进入容器
docker run -it zhengquantao/alipine:21.2.23 bash
# 运行容器,停止自动删除容器 --rm
docker run --rm --name mynginx -p:8001:80 -d zhengquantao/nginx:v1
# 运行容器,挂载文件 -v
docker run --rm --name mynginx_baidu -d -p 8003:80 -v D:/dockerImage:/usr/share/nginx/html zhengquantao/nginx:v1
# 运行容器,传入环境名 -e
docker run --rm --name mynginx_baidu -d -p 8003:80 -e IP="http://www.baidu.com" -v D:/dockerImage:/usr/share/nginx/html zhengquantao/nginx:v1
# 运行容器,关联多个容器 --link
docker run --name waterland -p 8003:8003 -p 8004:8004 -p 8188:8188 --link mysql:my-mysql -v /root/waterland-cms-bn:/app waterland:v1
  • 进入正在运行的容器

docker exec -it containId /bin/bash
  • 停止、开始、重启容器
docker stop/start/restart containerId(容器ip/名字) 
  • 提交容器成镜像
docker commit -p containId imageName(新名字)
  • 删除容器

docker rm -f containerId
  • 删除镜像
docker rmi imageId
  • 查看日志
docker logs -f containerId
  • 重定向输入日志
docker run containerId(名字) 2>&1 >> /dev/null 
  • 复制文件到指定容器
docker cp waterland.sql containerId:/waterland.sql
  •  MySQL导出数据
docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
  •  MySQL导入数据
docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
  • 导出镜像
docker save -o fileName.tar imageId
  • 导入镜像
docker load < fileName.tar
  •  导出容器
docker export fileName.tar containerId
  • 导入容器
docker import fileName.tar containerName
  • 构建
docker build -t zhengquantao/imageName .
  • Dockerfile
FROM zhengquantao/python-nginx:3.8

# 创建工作路径
RUN mkdir /app

COPY . /app

# 指定容器启动时执行的命令都在app目录下执行
WORKDIR /app


# 替换nginx的配置
COPY nginx.conf /etc/nginx/nginx.conf

# 添加证书文件
# COPY cert /etc/nginx/cert


# 升级pip
RUN pip3 install --upgrade pip -i  https://mirrors.aliyun.com/pypi/simple


# pip读取requirements.txt内容安装所需的库
RUN pip3 install -r requirements.txt -i  https://mirrors.aliyun.com/pypi/simple

# PORT
#EXPOSE 8000
#EXPOSE 8001
#EXPOSE 8135
#EXPOSE 8134


# 启动nginx和uwsgi,这里一定要加上-g,主要目的就是设置pid=1。因为docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果pid=1的程序挂了,那容器就挂了。
#ENTRYPOINT ["nginx"]
CMD bash /app/env.sh
ENTRYPOINT nginx -g "daemon off;" && uwsgi -i uwsgi.ini
  • docker-compose.yml
version: '3'
services:
  mysql:
    build: ./mysql
    ports: 
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    restart: always
  flask:
    build: ./flask
    ports:
     - "5000:5000"
    volumes:
      - ":"
    links: 
     - mysql:mysql
    restart: always
  • env.sh
#!/usr/bin/env sh
find '/app/admin/dist/js' -name '*.js' -exec sed -i -e 's/baseURL=".*"/baseURL="$IP"/g' {} ;
find '/app/client/dist/js' -name '*.js' -exec sed -i -e 's/baseURL=".*"/baseURL="$IP"/g' {} ;

Docker高级操作

  • -e  环境变量

       docker技术之所以这么流行 比其他容器技术更加受欢迎 很大一部分原因是 可以在运行时传入环境变量 -e  ,通过这个传入环境变量用户可以在不改变任何代码的情况下  可以配置程序, 真正实现一套代码多端运行。举个列子,一个前后端分离的项目。前端vue.js,后端 goland等其他语言。当这个项目在这个服务器上运行没有问题,当你需要迁移到其他服务器时,前端就要更改请求IP重新打包。这样就变得异常繁琐。这时候你通过-e 转入请求IP 就避免了重新打包。可以-e 使你的程序更加灵活。

  • -v 挂载数据

  绑定本地数据到docker容器之中,本地数据变化 相应的docker中数据也跟着变化。一般用于本地开发

  • 安装docker

yum install docker
  • 查看是否安装成功

docker info 
# 或者
docker version
  • 换源 

  vi /etc/docker/daemon.json
  # 增加
 {
    "registry-mirrors": ["https://3zfwxe4j.mirror.aliyuncs.com"]
  }
 # 重启
  systemctl restart docker
  • 登录dockerHub

docker login docker.io
  • 查找镜像
docker search imageName(镜像名)
  • 下载镜像
docker pull imageName(镜像名)
  • 上传镜像

docker push docker.io/username/imageName(镜像名)
  • 改镜像名

docker tag imageId(镜像id) docker.io/zhengquantao/imageName(新镜像名)
  • 查看镜像

docker images
  • 查看所有容器名

# 查看正在运行容器
docker ps
# 查看所有容器,包含停止的容器
docker ps -a
  • 运行容器

# 运行进入容器
docker run -it zhengquantao/alipine:21.2.23 bash
# 运行容器,停止自动删除容器 --rm
docker run --rm --name mynginx -p:8001:80 -d zhengquantao/nginx:v1
# 运行容器,挂载文件 -v
docker run --rm --name mynginx_baidu -d -p 8003:80 -v D:/dockerImage:/usr/share/nginx/html zhengquantao/nginx:v1
# 运行容器,传入环境名 -e
docker run --rm --name mynginx_baidu -d -p 8003:80 -e IP="http://www.baidu.com" -v D:/dockerImage:/usr/share/nginx/html zhengquantao/nginx:v1
# 运行容器,关联多个容器 --link
docker run --name waterland -p 8003:8003 -p 8004:8004 -p 8188:8188 --link mysql:my-mysql -v /root/waterland-cms-bn:/app waterland:v1
  • 进入正在运行的容器

docker exec -it containId /bin/bash
  • 停止、开始、重启容器
docker stop/start/restart containerId(容器ip/名字) 
  • 提交容器成镜像
docker commit -p containId imageName(新名字)
  • 删除容器

docker rm -f containerId
  • 删除镜像
docker rmi imageId
  • 查看日志
docker logs -f containerId
  • 重定向输入日志
docker run containerId(名字) 2>&1 >> /dev/null 
  • 复制文件到指定容器
docker cp waterland.sql containerId:/waterland.sql
  •  MySQL导出数据
docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
  •  MySQL导入数据
docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
  • 导出镜像
docker save -o fileName.tar imageId
  • 导入镜像
docker load < fileName.tar
  •  导出容器
docker export fileName.tar containerId
  • 导入容器
docker import fileName.tar containerName
  • 构建
docker build -t zhengquantao/imageName .
  • Dockerfile
FROM zhengquantao/python-nginx:3.8

# 创建工作路径
RUN mkdir /app

COPY . /app

# 指定容器启动时执行的命令都在app目录下执行
WORKDIR /app


# 替换nginx的配置
COPY nginx.conf /etc/nginx/nginx.conf

# 添加证书文件
# COPY cert /etc/nginx/cert


# 升级pip
RUN pip3 install --upgrade pip -i  https://mirrors.aliyun.com/pypi/simple


# pip读取requirements.txt内容安装所需的库
RUN pip3 install -r requirements.txt -i  https://mirrors.aliyun.com/pypi/simple

# PORT
#EXPOSE 8000
#EXPOSE 8001
#EXPOSE 8135
#EXPOSE 8134


# 启动nginx和uwsgi,这里一定要加上-g,主要目的就是设置pid=1。因为docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果pid=1的程序挂了,那容器就挂了。
#ENTRYPOINT ["nginx"]
CMD bash /app/env.sh
ENTRYPOINT nginx -g "daemon off;" && uwsgi -i uwsgi.ini
  • docker-compose.yml
version: '3'
services:
  mysql:
    build: ./mysql
    ports: 
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    restart: always
  flask:
    build: ./flask
    ports:
     - "5000:5000"
    volumes:
      - ":"
    links: 
     - mysql:mysql
    restart: always
  • env.sh
#!/usr/bin/env sh
find '/app/admin/dist/js' -name '*.js' -exec sed -i -e 's/baseURL=".*"/baseURL="$IP"/g' {} ;
find '/app/client/dist/js' -name '*.js' -exec sed -i -e 's/baseURL=".*"/baseURL="$IP"/g' {} ;

Docker高级操作

  • -e  环境变量

       docker技术之所以这么流行 比其他容器技术更加受欢迎 很大一部分原因是 可以在运行时传入环境变量 -e  ,通过这个传入环境变量用户可以在不改变任何代码的情况下  可以配置程序, 真正实现一套代码多端运行。举个列子,一个前后端分离的项目。前端vue.js,后端 goland等其他语言。当这个项目在这个服务器上运行没有问题,当你需要迁移到其他服务器时,前端就要更改请求IP重新打包。这样就变得异常繁琐。这时候你通过-e 转入请求IP 就避免了重新打包。可以-e 使你的程序更加灵活。

  • -v 挂载数据

  绑定本地数据到docker容器之中,本地数据变化 相应的docker中数据也跟着变化。一般用于本地开发