Docker- 常用命令教程&安装mysql

目录

Linux安装Docker

Docker常用命令

项目开发常用命令汇总:

容器

镜像

Docker run 命令

Docker 设置时区

Docker 查看容器中运行进程

Docker 导入导出镜像:

Docker 登录远程镜像中心&操作:

Docker 安装mysql

配置Docker国内镜像


Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 (<仓库名>:<标签>)就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

Linux安装Docker

查看系统版本信息

lsb_release -a

安装Docker

yum -y install docker

-y表示不询问安装,直到安装成功,安装完后查看安装列表

yum list installed | grep docker

启动docker

systemctl start docker

查看docker服务状态

systemctl status docker
设置开机启动
systemctl enable docker.service

Docker常用命令

项目开发常用命令汇总:

制作镜像
docker build -t test/test-registry .

创建并启动容器

docker run --name test-registry -d -p 1001:1001 test/test-registry

查看容器日志

docker logs 参数 容器id

  • -f follow 表示实时显示日志
  • -t timestamp 表示显示时间戳
  • --tail=n 或 --tail n 表示显示末尾n行

例如:
docker logs -f --tail 200 ContainerId,表示实时加载日志信息,并且仅显示最后200行。

查看容器IP地址

docker inspect 容器ID

进入容器

docker exec -it 775c7c9ee1e1 /bin/bash

Docker日期同步

在Dockerfile添加:

# 添加时区环境变量,亚洲,上海
ENV TimeZone=Asia/Shanghai    
# 使用软连接,并且将时区配置覆盖/etc/timezone
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone

Docker导出和导入
# 导出镜像
docker save -o nginx.tar nginx:1.14

# 导出到gz

docker save xxx:1.11.0 | gzip > xxx[1.11.0].tar.gz
 
# 导入镜像,nginx.tar就是刚才导出的包
docker load -i nginx.tar

  • nginx.tar是导出tar包的文件名,
  • nginx:1.14是仓库中的镜像名称,这里也可以直接使用镜像ID

常用基础镜像 

docker pull openjdk:8-jre-alpine

docker pull openjdk:8-jre-alpine

容器

获取镜像
docker pull ubuntu

启动容器
docker run -it ubuntu /bin/bash

参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

要退出终端,直接输入
exit

查看所有的容器
docker ps -a

停止重启一个容器
docker stop <容器 ID>
docker restart <容器 ID>
强制删除容器(-f)
docker rm -f <容器 ID>

镜像

列出镜像列表
docker images

列出镜像:使用关键字过滤(部署十分有用)

docker images|grep misc

查找镜像、拖取镜像、删除镜像
docker search httpd
docker pull httpd
docker rmi hello-world

构建镜像
使用命令docker build,从零开始来创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

指令说明:

  • 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
  • FROM:指定使用哪个镜像源
  • RUN:指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

设置镜像标签
docker tag <镜像ID> 镜像源名:标签名
docker tag 860c279d2fec runoob/centos:dev

Docker run 命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb": 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v:    绑定一个卷

实例
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest

使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/# 

Docker 设置时区

Dockerfile
# Set time zone to Shanghai UTC+8
RUN echo "Asia/Shanghai" > /etc/timezone

https://bobcares.com/blog/change-time-in-docker-container/

Docker 查看容器中运行进程

docker top : 查看容器中运行的进程信息,支持 ps 命令参数。

docker top <container_id>

 

Docker 导入导出镜像:

导出镜像:

docker export <your-container-id> > name-xxx.tar

Or:

docker save <your-image-id> > name-xxx.tar

docker save -o images.tar postgres:latest mongo:3.4

导入镜像:

docker import my_ubuntu_v3.tar runoob/ubuntu:v4

Or: 

docker load < nginx.tar

docker load -i nginx.tar

实用技巧:由于网络或者其他原因,有时候需要将镜像打包成gz压缩大小方便传输,可使用一下命令(打包好的gz比tar确实小了很多)

docker save openjdk:8u252-jre | gzip > openjdk-8u252-jre.tar.gz

区别:

1,文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像

2,是否可以对镜像重命名
docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名

3,是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持

4,是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5,应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

Docker 登录远程镜像中心&操作:

登录:

docker login www.<your-image-hub>.com -u 用户名 -p 密码

查看状态:

cat /root/.docker/config.json

可显示登录的凭证

推送镜像

docker tag test/yourapp www.<your-image-hub>.com/test/yourapp
docker push www.<your-image-hub>.com/test/yourapp

Docker 安装mysql

1. docker pull mysql:latest

2. docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

参数说明:

  • -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
  • MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
  • --name 指定容器名称
  • mysql ImageId

3. 进入容器,修改root用户允许远程访问
docker exec -it mysql-test bash

4. 登录到Docker mysql
mysql -uroot -p

5. 修改远程权限

> use mysql;
> select host,user from user;
> alter user 'root'@'%' identified with mysql_native_password by '123456xx';
> flush privileges;

6. 查看docker日志
docker logs -f --tail 10 a4dac74d48f7

  • 10 表示查看10行
  • a4dac74d48f7 容器ID

配置Docker国内镜像

1. vi /etc/docker/daemon.json

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

Docker Desktop on Windows镜像设置也一样,可设置多个镜像:

  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]

 2. 重启Docker

systemctl daemon-reload

systemctl restart docker

3. 查看Docker配置是否生效

docker info

Tips:

Docker暴露2375端口导致服务器被攻击问题及解决方法

原因:

docker对user namespace没有做隔离,也就是说,容器内部的root用户就是宿主机的root用户,一旦挂载目录,就可以在容器内部以宿主机的root用户身份对挂载的文件系统随意修改了。

解决办法:

参考官网说明:Protect the Docker daemon socket | Docker Documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值