Docker 常用命令

Table of Contents

容器(Container)是通过镜像(image)创建的。容器是在原先的image之上新加了一层,这一层是可读可写的,镜像只是可读的。 在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。 Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP。

Docker命令行参考

镜像(image)

Docker 把应用程序及其依赖,打包在 image 文件里面,通过这个文件生成 Docker 容器。image 文件可以看作是容器的模板。

  • 拉取仓库代码到本地

    docker image pull library/hello-world

    docker官方提供的默认在library中,可以省略library

    docker image pull hello-world

  • 查看所有镜像文件

    docker image list

docker run& docker container run 区别:前者是1.13之前使用的命令,后者是1.13后新增加的,作用效果一样。参考说明

  • 从image文件中生成一个正在运行的容器实例

    docker container run xxxx

  • 手动终止运行的容器

    docker container kill xxxx

  • 以交互模式运行容器 (后边可以跟需要打开的shell)

    docker container run -it xxxx (bin/bash)

容器

更多命令参考 👉🏻 (官方文档)

  • 列出本机正在运行的容器

    docker container list

  • 列出本机所有容器,包括终止运行的容器

    docker container ls -all

  • 启动终止的容器

    docker container start <container id>

    run和start的区别:第一次使用run; 容器已经生成并且已经停止运行使用start *容器后台运行加 -d 参数*

  • 重启正在运行的容器

    docker container restart <container id>

  • 停止正在运行的容器

    docker container stop <container id>

  • 删除容器文件(终止运行的容器文件,依然会占据硬盘空间)

    docker container rm <container id>

  • 获取容器的运行的输出

    docker container logs <container id>

  • 进入容器

    使用attach命令进入容器后,如果从这个stdin中exit,会导致容器的停止。使用exec容器则不会停止

    docker container attach <container id>

    docker container exec -it <container id> (bash)

  • 清理掉所有处于终止状态的容器

    docker container prune

  • 复制主机文件到docker容器

    docker container cp 主机文件 docker地址

docker容器访问宿主机

docker相当于一个单独的系统,所以访问宿主机上mysql等,不能直接使用127.0.0.1或者localhost,使用这两个访问的是docker容器内部自身的回环地址。

如何访问宿主机呢。需要用到docker的创建的一个linux网桥, 一般使用ifconfig可以看到。

所以在docker容器中地址需要使用172.17.0.1就能访问了。当然还需要宿主机的mysql或者其他应用开启ip访问才可以

宿主机器访问docker容器中的服务

如果想要外部访问到docker容器中的服务,在使用docker run命令第一次启动时,一定要做端口映射,把docker中的端口映射到本地端口上。那样本地才可以进行访问。不加端口映射本地直接端口是不通的。

docker container run -d -p 主机(宿主)端口:容器端口 container_id

进入docker容器内部

docker container exec -it <container id> /bin/bash(bash)

使用exec 命令进入一个容器内容,相当于进入一台linux机器中。需要在容器中安装应用宝,或者其他操作,就需要进入到容器重进行操作。


问题记录:

  1. docker容器中服务访问宿主机mysql.

    使用docker0 网卡访问宿主机mysql,一直报错密码错误,1045, "Access denied for user 'xxxxx'@'172.18.0.2' (using passwor)原因是mysql账号没有开始指定ip的访问,导致连接被拒绝。

    解决步骤: Docker容器内连接宿主机的Mysql服务器

    mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
     mysql>flush privileges;
    // 其中各字符的含义:
    // *.* 对任意数据库任意表有效
    // "root" "123456" 是数据库用户名和密码
    // '%' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
    // flush privileges 刷新权限信息
    
  2. docker容器中应用访问宿主机服务

    宿主机搭建了代理服务,使用了nginx进行了端口转发。在容器中访问代理服务端口,一直访问不通

    解决步骤:可能因为宿主机的端口被nginx做了转发,(docker网络访问这一块有点没搞明白)

    排查步骤:

    1. 先排查服务器防火墙和端口是否打开,(没打开)
    2. 进入到docker容器内ping docker0 网卡,看是否ping通(可以通)
    3. 更改nginx设置,放开docker0 网卡的访问权限(在nginx中有限制ip的访问)
    4. 请求访问返回403,打开nginx日志,查看访问的ip, 把访问的ip加入到允许权限中,
    5. 直接访问80端口可以访问宿主机的代理服务了。