Docker 常用命令
Table of Contents
容器(Container)是通过镜像(image)创建的。容器是在原先的image之上新加了一层,这一层是可读可写的,镜像只是可读的。 在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。 Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP。
镜像(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机器中。需要在容器中安装应用宝,或者其他操作,就需要进入到容器重进行操作。
问题记录:
-
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 刷新权限信息
-
docker容器中应用访问宿主机服务
宿主机搭建了代理服务,使用了nginx进行了端口转发。在容器中访问代理服务端口,一直访问不通
解决步骤:可能因为宿主机的端口被nginx做了转发,(docker网络访问这一块有点没搞明白)
排查步骤:
- 先排查服务器防火墙和端口是否打开,(没打开)
- 进入到docker容器内ping
docker0
网卡,看是否ping通(可以通) - 更改nginx设置,放开
docker0
网卡的访问权限(在nginx中有限制ip的访问) - 请求访问返回403,打开nginx日志,查看访问的ip, 把访问的ip加入到允许权限中,
- 直接访问80端口可以访问宿主机的代理服务了。