• 0

  • 482

  • 收藏

docker入门-常用命令

None

关注Linux

1个月前

软件开发最大的问题之一,就是环境配置。

开发环境没错,测试环境报错。最后发现是jdk环境不对造成的

测试环境没错,生产环境报错。最后发现是依赖没有安装,或者环境变量没有配置

为了解决上面的问题,很多人就在想,能不能在安装的时候,把原始环境一模一样地复制过来。

虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样。但是它有个很大的缺点就是耗费资源太多了。想一下,如果你这个应用程序只会占用几十m的内存,但是虚拟机就要占用至少几百m的内存,这样资源利用率是非常低的。而且启动也比较慢,经常需要花费几分钟的时间。

由于虚拟机的缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。它不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。相对于虚拟机来说,它的优点就很明显了:

  • 启动快:启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度快很多。
  • 资源占用率低:容器只占用需要的资源,不占用那些没有用到的资源,并且容器之间可以共用本机资源,资源利用率是比较高的。

说了这么多,那docker是什么呢,先看一下百度百科的解释:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

这里出现了一个新词:应用容器引擎,那什么是应用容器引擎呢?

上面说的LXC仅为一种轻量级的容器化技术,它仅能对部分资源进行限制,无法做到诸如网络限制、磁盘空间占用限制等。dotCloud公司结合LXC和以下列出的技术实现了Docker容器引擎,相比于LXC,Docker具备更加全面的资源控制能力,是一种应用级别的容器引擎。

Docker引擎运行在操作系统上,是基于内核的LXC、Chroot(该技术能在container里构造完整的Linux文件系统)等技术实现容器的环境隔离和资源控制,在容器启动后,容器里的进程直接与内核交互,无需经过Docker引擎中转,因此几乎没有性能损耗,能发挥出裸机的全部性能。但由于Docker是基于Linux内核技术实现容器化的,因此使得容器内运行的应用只能运行在Linux内核的操作系统上。

概念啥的只需要了解一下就行了,毕竟我们不是专门做运维的,只需要知道一些常用的docker命令,出现问题了知道怎么排查就行了,再复杂的东西交给运维来做就行了。接下来就讲讲下面几个方面:

  • 环境搭建
  • 常用命令
  • 常用软件部署
  • 如何制作一个docker镜像

一. 环境搭建

centos下docker的安装

安装所需的软件包:

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
复制代码

设置阿里云的源:

sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码

安装最新的docker:

sudo yum install docker-ce docker-ce-cli containerd.io
复制代码

Docker 安装完默认未启动,需要启动:

sudo systemctl start docker
复制代码

测试一下docker是否安装启动成功:

sudo docker run hello-world
复制代码

出现上面的提示说明docker是启动成功的。

接下来还需要配置一下docker镜像加速,因为某些原因国内从DockerHub拉镜像下来会非常慢,所以可以配置一下国内镜像加速服务,这里我用的阿里云,阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登录后在侧边栏镜像加速器获取到加速地址:

https://lingxiao.mirror.aliyuncs.com
复制代码

然后在 /etc/docker/daemon.json文件中配置地址:

 vim /etc/docker/daemon.json
 # 添加下面的内容
 {"registry-mirrors":["https://lingxiao.mirror.aliyuncs.com"]}
复制代码

最后需要重新启动一下docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码

win10下docker的安装

在Window上安装的Docker引擎其实是利用了Window自带的Hyper-V虚拟化工具自动创建了一个Linux系统,容器内的操作实际上是间接使用这个虚拟系统实现的。

Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。

通过命令来启用 Hyper-V ,右键开始菜单并以管理员身份运行 PowerShell,执行下面的命令:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
复制代码

Docker Desktop 官方下载地址: hub.docker.com/editions/co…

下载完成后直接安装就可以了。

镜像加速也要配置一下:

然后点击Apply&Restart就会自动重启。

二. 常用命令

先介绍一些概念: 镜像(image):类似虚拟机镜像,可以把它看做我们下载的.iso文件 容器(container ):依赖于镜像,类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。

接下以创建一个jdk环境的容器为例

1.镜像相关命令

查看镜像

docker images
复制代码

这个时候是没有任何镜像的:

[root@host1592875735 ~]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
复制代码

搜索镜像

docker search [名字]
复制代码

我们可以搜一下有哪些可用jdk镜像:

[root@host1592875735 ~]# docker search openjdk
openjdk                         OpenJDK is an open-source implementation of …   2569      [OK]
adoptopenjdk                    Official Images for OpenJDK + HotSpot and Op…   228       [OK]
adoptopenjdk/openjdk11          Docker Images for OpenJDK Version 11 binarie…   115
adoptopenjdk/openjdk8           Docker Images for OpenJDK Version 8 binaries…   80
adoptopenjdk/openjdk8-openj9    Docker Images for Eclipse OpenJ9 Version 8 b…   41
adoptopenjdk/openjdk11-openj9   Docker Images for Eclipse OpenJ9 Version 11 …   32
arm64v8/openjdk                 OpenJDK is an open-source implementation of …   22
adoptopenjdk/openjdk12          Docker Images for OpenJDK Version 12 binarie…   18
arm32v7/openjdk                 OpenJDK is an open-source implementation of …   16
shipilev/openjdk                OpenJDK development builds                      11
circleci/openjdk                CircleCI images for OpenJDK                     10                   [OK]
adoptopenjdk/openjdk13          Docker Images for OpenJDK Version 13 binarie…   8
adoptopenjdk/openjdk14          Docker Images for OpenJDK Version 14 binarie…   8
adoptopenjdk/openjdk15          Docker Images for OpenJDK Version 15 binarie…   4
adoptopenjdk/openjdk10          Docker Images for OpenJDK Version 10 binarie…   3
amd64/openjdk                   OpenJDK is an open-source implementation of …   2
adoptopenjdk/openjdk9           Docker Images for OpenJDK Version 9 binaries…   2
symphonicsoft/openjdkbase       Openjdk base images with dumb-init              1
winamd64/openjdk                OpenJDK is an open-source implementation of …   1
suranagivinod/openjdk8          openjdk:8-jre-slim, zip & unzip                 0
cimg/openjdk                    The CircleCI OpenJDK (Java) Docker Convenien…   0
classmethod/openjdk-with-git    docker image for openjdk and git                0                    [OK]
cfje/openjdk                    OpenJDK Builder Image                           0
ccistaging/openjdk              CircleCI images for OpenJDK                     0                    [OK]
ccitest/openjdk                 CircleCI test images for OpenJDK                0                    [OK]
复制代码

拉取镜像

docker pull [名字]
复制代码

就拉第一个镜像吧:

[root@host1592875735 ~]# docker pull openjdk
Using default tag: latest
latest: Pulling from library/openjdk
a73adebe9317: Pull complete
01539a440662: Pull complete
89c470979f08: Pull complete
Digest: sha256:1af79a05f92a28af69a3f5dc2466297be071f86101e308553c85b5d59020e638
Status: Downloaded newer image for openjdk:latest
docker.io/library/openjdk:latest
[root@host1592875735 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
openjdk      latest    bc2876126561   7 days ago   486MB
复制代码

删除镜像

docker rmi [镜像id/名字]
复制代码

删除指定的镜像 ,比如none镜像

docker rmi $(docker images | grep "none" | awk '{print $3}')
复制代码

2.容器相关命令

查看正在运行的容器

docker ps
复制代码

查看所有容器

docker ps -a		
复制代码

查看最后一次运行的容器

docker ps -f status=exited
复制代码

镜像拉成功了,但是我们没有创建容器,所以上面命令是看不见任何东西的。

创建与启动容器

创建容器命令: docker run

-i:表示运行容器

-t:表示容器启动后会进入命令行。加入这两个参数后,容器创建之后就能登录进去,即分配一个伪终端

--name:为创建的容器命名

-v:表示目录映射关系 前面是宿主机目录,后面是映射到docker容器上的目录,可以使用多个-v做多个目录或文件映射。

-d:在run后加上-d参数,会创建一个守护式容器在后台运行。和-t相反

-p:表示端口映射,前面是宿主机端口,后面是容器内的映射端口。

  1. 交互式方式创建容器(创建成功之后会自动登录容器,退出当前容器之后,容器会变成停止状态)

    docker run -it --name=容器名称 镜像名称:标签 /bin/bash
    复制代码

    创建一个jdk容器:

    [root@host1592875735 ~]# docker run -it --name=jdk openjdk /bin/bash
    bash-4.4# java -version
    openjdk version "15.0.1" 2020-10-20
    OpenJDK Runtime Environment (build 15.0.1+9-18)
    OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
    复制代码

    可以看到这个容器是有jdk环境的

    退出当前容器:exit

    然后再使用docker ps查看正在运行的容器是没有的。

  2. 守护式方式创建容器(创建成功之后不会自动登录容器,退出当前容器之后,容器也不会停止)

    docker run -id --name=容器名称 镜像名称:标签
    复制代码

    登录守护式容器方式:

    docker exec -it 容器名称(或者容器id) /bin/bash
    复制代码

停止容器:

docker stop 容器名称(或者容器id)
复制代码

启动容器:

docker start 容器名称(或者容器id)
复制代码

3.文件拷贝

如果我们需要将文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录  容器名称:容器目录
复制代码

将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录
复制代码

4.目录挂载

创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器 添加-v参数 宿主机目录:容器目录 如:

docker run -id -v /user/local/static:/usr/local/static --name=centos1 centos:latest
复制代码

如果出现权限不足的问题,我们需要添加参数 --privileged=true来解决

5.查看容器ip地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器id)
复制代码

数据太多,可以过滤以下

docker inspect --format=`{{.NetworkSettings.IPAddress}}` 容器名称(id)
复制代码

删除容器

docker rm 容器名称(容器id)
复制代码

6. 查看日志

docker logs [OPTIONS] CONTAINER

Options:

    --details        显示更多的信息
-f, --follow         跟踪实时日志
    --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    --tail string    从日志末尾显示多少行日志, 默认是all
-t, --timestamps     显示时间戳
    --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
复制代码

查看最近30分钟的日志:

docker logs --since 30m CONTAINER_ID
复制代码

查看某时间之后的日志:

docker logs -t --since="2021-01-13T13:23:37" CONTAINER_ID
复制代码

查看指定时间后的日志,只显示最后100行:

docker logs -f -t --since="2021-01-13" --tail=100 CONTAINER_ID
复制代码

查看某时间段日志:

docker logs -t --since="2021-01-12T13:23:37" --until "2021-01-13T12:23:37" CONTAINER_ID
复制代码

查看实时日志

docker logs -f -t --since="2021-01-12" --tail=10 CONTAINER_ID
复制代码

三. 常用容器部署

1. mysql容器部署

  1. 拉取mysql镜像

    docker pull centos/mysql-57-centos7
    复制代码
  2. 创建容器

    docker run -id --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
    复制代码

    -p表示端口映射,前面的是宿主机端口,后面的是容器运行端口

    -e表示添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码

  3. 进入mysql容器

    docker exec -it tensquare_mysql /bin/bash
    复制代码
  4. 登录mysql

    mysql -u root -p
    复制代码
  5. 远程登录mysql

    连接宿主机的ip,指定端口为3306

2. Tomcat部署

  1. 拉取镜像

    docker pull tomcat:7-jre7
    复制代码
  2. 创建容器

    docker run -id --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/wbeapps tomcat:7-jre7
    复制代码

3. Nginx部署

  1. 拉取镜像

    docker pull nginx
    复制代码
  2. 创建容器

    docker run -d --net host -p 80:80 --name nginx-web \
    -v /home/nginx/www:/usr/share/nginx/html \
    -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/nginx/logs:/var/log/nginx \
    -v /www/wwwroot/blog:/www/wwwroot/blog \
    nginx
    复制代码

4. Redis部署

  1. 拉取镜像

    docker pull redis
    复制代码
  2. 创建容器

    docker run -id --name=myredis -p 6379:6379 redis
    复制代码

5. 迁移与备份

我们可以通过以下命令将容器保存为镜像

docker commit mynginx mynginx_image
复制代码

我们可以通过以下命令将镜像保存为tar文件

docker save -o mynginx.tar mynginx_image
复制代码

镜像恢复与迁移

我们先删除存在的mynginx镜像,然后执行下面的命令恢复

docker load -i mynginx.tar
复制代码

四. 编写Dockerfile制作镜像

Dockerfiel是由一系列命令和参数构成的脚本(可以看成是shell脚本),这些命令基于基础镜像并最终创建一个新的镜像

常用命令:

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 可以多条
RUN command dpckerfile的核心部分 可以多条
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是压缩文件,会在复制后自动解压
COPY source_dir/file dest_dir/file 和add相似,但是有压缩文件不会自动解压
WORKDIR path_dir 设置工作目录

dockerfile构建jdk1.8镜像

FROM centos:7
MAINTAINER lingxiao
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
复制代码

私有仓库搭建与配置

  1. 拉取私有仓库镜像

    docker pull registry
    复制代码
  2. 启动私有仓库容器

    docker run -id --name=registry -p 5000:5000 registry
    复制代码
  3. 浏览器输入http://ipaddress:5000/v2/_catalog 看到{"repositories": []}表示私有仓库创建成功并且内容为空

  4. 修改daemon.json

    vim /etc/docker/daemon.json
    复制代码

    添加已下内容,保存退出

    {"insecure-registries":["ipaddress:5000"]}
    复制代码

    此步用于让docker信任私有仓库

  5. 重启docker

    systemctl restart docker
    复制代码

镜像上传至私有仓库

  1. 给镜像打上一个标记

    docker tag jdk1.8 ipaddress:5000/jdk1.8
    复制代码
  2. 上传标记的镜像

    docker push ipaddress:5000/jdk1.8
    复制代码

参考:

Docker 入门教程-阮一峰

技术选型之Docker容器引擎

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

Linux中文社区

482

相关文章推荐

未登录头像

暂无评论