docker操作

1. 基本命令

命令说明
docker version显示 Docker 版本信息
docker info显示 Docker 系统信息,包括镜像和容器数
docker search从 Docker Hub 中搜索符合条件的镜像
docker pull从 Docker Hub 中拉取或者更新指定镜像
docker images列出本地所有镜像
docker ps查看正在运行的容器
-a 查看所有的容器
-q 仅列出容器ID
docker rmi删除本地镜像
-f 强行移除该镜像,即使其正被使用
docker rm
docker rm -f $(docker ps -aq)
删除容器 强行移除该容器,即使其正在运行
删除全部容器
docker history查看指定镜像的创建历史
docker start|stop|restart启动、停止和重启一个或多个指定容器
-i 启动一个容器并进入交互模式
docker kill杀死一个或多个指定容器进程
docker run从镜像中运行一个新实例
-d 后台运行容器,并返回容器ID
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端
–name=“nginx-lb” 为容器指定一个名称
docker stop从镜像中停止一个实例
docker top查看一个正在运行容器进程
docker inspect检查镜像或者容器的参数,默认返回 JSON 格式
docker push将镜像推送至远程仓库,默认为 Docker Hub
docker logs获取容器运行时的输出日志
-f 跟踪容器日志的最近更新
-t 显示容器日志的时间戳
–tail=“10” 仅列出最新10条容器日志
docker exec进入docker容器
-d 以后台方式执行命令
-i,交互模式
-t,设置TTY
docker build构建镜像
-t 镜像的名字及标签

2. dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像 。

2.1 dockerfile命令

命令说明
FROM指定基础镜像, FROM命令必须是Dockerfile的首个命令
如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像
MAINTAINER声明作者
WORKDIR设置CMD指明的命令的运行目录
COPY文件复制
ADD文件复制,比COPY更高级,源路径可以是一个URL,如果源是一个URL,那该URL的内容将被下载并复制到容器中 。
例:ADD /my_app_folder /my_app_folder
ENV设置环境变量
RUN接受命令作为参数并用于创建镜像
USER设置运行容器的UID
CMD用于指定在容器启动时所要执行的命令
例:CMD “echo” “Hello docker!”
VOLUME在镜像中创建挂载点 ,用于让你的容器访问宿主机上的目录
ENTRYPOINT和CMD类似,用于配置容器启动后执行的命令,不同的是不可被 docker run 提供的参数覆盖 ;且docker run命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT ;每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
ONBUILD用于设置镜像触发器
EXPOSE暴露端口,使容器内的应用可以通过端口和外界交互

2.2 hello dockerfile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7cq5LwB-1648894312397)(D:/%E7%BC%96%E7%A0%81/docker/25_docker/assets/815181-20161108115424858-614325566.png)]

1) 编写dockerfile

# 1、第一行必须指定基础镜像信息
FROM docker.io/alpine
# 2、维护者信息
MAINTAINER dacai
# 3、容器启动执行指令
CMD echo "hello docker!"

2) 构建镜像

命令最后有一个 . 表示当前目录

docker build -t hello_docker .

3) 测试

查看镜像

docker images

运行

docker run hello_docker

2.3 构建nginx镜像

1) 编写dockerfile

FROM docker.io/ubuntu
MAINTAINER dacai
RUN apt-get -y update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

2) 构建镜像

docker build -t dacai/nginx .

3) 测试

docker run -d -p 8888:80 --name mynginx dacai/nginx

2.4 构建web应用镜像

这里以基于springboot生成的jar为例

1) 编写dockerfile

FROM java
MAINTAINER dacai
ADD app.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

2) 构建镜像

docker build -t dacai/hello .

3) 测试

docker run -p 8888:8080 --name hello dacai/hello

然后可以在浏览器中测试web功能

2.5 镜像分层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UNI8rTt-1648894312397)(D:/%E7%BC%96%E7%A0%81/docker/25_docker/assets/r6Kp27nExo0OG33ZVP.png)]

2.6 原则与建议

  • 容器轻量化。从镜像中产生的容器应该尽量轻量化,能在足够短的时间内停止、销毁、重新生成并替换原来的容器。
  • 使用 .gitignore。在大部分情况下,Dockerfile 会和构建所需的文件放在同一个目录中,为了提高构建的性能,应该使用 .gitignore 来过滤掉不需要的文件和目录。
  • 为了减少镜像的大小,减少依赖,仅安装需要的软件包。
  • 一个容器只做一件事。解耦复杂的应用,分成多个容器,而不是所有东西都放在一个容器内运行。如一个 Python Web 应用,可能需要 Server、DB、Cache、MQ、Log 等几个容器。一个更加极端的说法:One process per container。
  • 减少镜像的图层。不要多个 Label、ENV 等标签。
  • 对续行的参数按照字母表排序,特别是使用apt-get install -y安装包的时候。
  • 使用构建缓存。如果不想使用缓存,可以在构建的时候使用参数--no-cache=true来强制重新生成中间镜像。

3. Docker Compose

Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。

通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

Compose 中有两个重要的概念:

  • 服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

3.1 Docker Compose 安装

1) 下载compose版本

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

如下载太慢切换到国内

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

2) 添加执行权限

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

3) 下载命令补全工具

curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

4) 测试

docker-compose --version

5) 常用命令

docker-compose build	# 构建镜像
docker-compose up		# 构建镜像并启动服务
docker-compose stop		# 停止服务
docker-compose down		# 停止并移除容器

3.2 搭建MySql

1) 下载MySql镜像

docker pull mysql

2) 编辑docker-compose.yml

version: '3'                                    # compose命令版本
services:                                       # 服务
  mysql:                                        # 服务名称,自定义
    restart: always
    image: docker.io/mysql                      # 镜像名称
    container_name: mysql                       # 容器名称,自定义
    ports:
      - '3306:3306'                             # 端口映射
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: root
      MYSQL_PASSWORD: 123456
    volumes:                                    # 挂载一个目录或者一个已存在的数据卷容器
      - ./data:/var/lib/mysql
    command:                                    # 覆盖容器启动后默认执行的命令
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    privileged: true                            # CentOS7中的安全模块selinux把权限禁掉了

3) 启动

docker-compose up
|
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --privileged=true   --name mysql57 mysql:5.7
注:3306:3306   宿主机端口=>容器端口

docker run -d -p 3308:3306 \
-v ~/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true   \
--name mysql577 \
mysql:5.7

可重启测试数据持久化

4) 客户端连接问题

比如sqlyog工具连接不上,可以尝试如下操作

  1. 进入mysql容器

    docker exec -it 【容器id】 bash
    
  2. 连接mysql

    mysql -uroot -p
    
    alter user 'root'@'localhost' identified with mysql_native_password by '123456';
    alter user 'root'@'%' identified with mysql_native_password by '123456';
    

3.3 编排web应用

1) jar

可以利用maven构建项目jar包

注意 :jar包构建的springboot工程application.yml中,mysql的连接方式使用mysql的镜像名而不是ip 。

在这里插入图片描述

2) web应用dockerfile

FROM java
MAINTAINER dacai
ADD hello.jar /app/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

3) 编辑docker-compose.yml

version: '3'                                    # compose命令版本
services:                                       # 服务
  web:
    build: ./web
    container_name: web
    ports:
      - '8899:8080'
    depends_on:
      - mysql
  mysql:                                        # 服务名称,自定义
    restart: always
    image: docker.io/mysql                      # 镜像名称
    container_name: mysql                       # 容器名称,自定义
    ports:
      - '3306:3306'                             # 端口映射
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: root
      MYSQL_PASSWORD: 123456
    volumes:                                    # 挂载一个目录或者一个已存在的数据卷容器
      - ./data:/var/lib/mysql
    command:                                    # 覆盖容器启动后默认执行的命令
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    privileged: true                            # CentOS7中的安全模块selinux把权限禁掉了

4) 启动

docker-compose up

4. volume

Docker 采用 volume (卷)的形式来向容器提供持久化存储。

默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。

一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。

如下列举几种方式来使用 data volume:

1) 使用 “-v 容器内目录” 形式

docker run -d -p 80:80 --name mynginx -v /var/www/html --privileged=true  dacai/nginx

然后使用 docker inspect 命令找到Docker 将本地一个 _data 目录 mount 为容器内的 /var/www/html目录了 。

在 web 容器被删除后,_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。 故不推荐

2) 使用 -v 来挂载一个主机上的目录到容器的目录

–privileged=true 设置挂载的目录权限

docker run -d -p 80:80 --name mynginx -v $PWD/html:/var/www/html --privileged=true  dacai/nginx

重新启动容器时,可以再次使用同样的方式来将$PWD/html目录挂载到新的容器内,这样就可以实现数据持久化的目标

3) 使用 docker volume 命令

Docker 新版本中引入了 docker volume 命令来管理 Docker volume 。

  1. 使用默认的 ‘local’ driver 创建一个 volume

    docker volume create --name vol1
    
    docker volume inspect vol1
    
  2. 使用这个 volume

    docker run -d -p 80:80 --name mynginx -v vol1:/var/www/html --privileged=true  dacai/nginx
    
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐