curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
apt-get install docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
docker使用unix套接字进行通信,在安装好docker后,为了让某一个用户可以不使用sudo直接使用docker,则需要将那个用户添加到docker组内,在安装了docker,docker组自动创建好,因此,使用以下命令将指定用户添加到docker组:
usermod -aG docker username
虚拟机的话需要重启,如有必要,可以使用以下命令更新group:
newgrp docker
这样配置有一定的隐患,因为docker
组拥有与root
用户等效的权限
无根模式允许以非 root 用户身份运行 Docker 守护进程和容器,以缓解守护进程和容器运行时中的潜在漏洞。
无根模式即使在安装 Docker 守护进程的过程中也不需要 root 权限,只要满足先决条件即可。
systemctl enable docker.service
systemctl enable containerd.service
默认情况下,Docker 会捕获所有容器的标准输出(和标准错误),并使用 JSON 格式将它们写入文件中。JSON 格式用它的来源(stdout或stderr)和它的时间戳来注释每一行。每个日志文件仅包含有关一个容器的信息。
默认情况下,Docker 守护进程侦听 UNIX 套接字上的连接以接受来自本地客户端的请求。通过将 Docker 配置为侦听 IP 地址和端口以及 UNIX 套接字,可以允许 Docker 接受来自远程主机的请求。
docker image
docker search 镜像名
docker image pull 镜像名
docker image rm 镜像名
有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。注意,run是生成新的容器,如果想要重复使用容器,应该使用start。
docker container run imagename
docker container start [containID]
docker container kill [containID]
# 列出本机正在运行的容器
docker container ls
# 列出本机所有容器,包括终止运行的容器
docker container ls --all
docker container rm [containerID]
docker container stop [containerID]
如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令查看输出。
docker container logs [containerID]
docker container exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
docker container exec -it [containerID] /bin/bash
–restart是开机自启,update是将参数加入到容器中。
docker update --restart=always 容器别名或容器id
docker container cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
docker container cp [containID]:[/path/to/file] .
使用Dockerfile文本文件配置image,生成二进制的image文件
FROM node:8.4
COPY . /app
WORKDIR /app
RUN ["npm", "install", "--registry=https://registry.npm.taobao.org"]
EXPOSE 3000/tcp
FROM node:8.4
:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4
,即8.4版本的 node,通过docker image ls 可查看node的标签。
COPY . /app
:将当前目录下的所有文件(除了.dockerignore
排除的路径),都拷贝进入 image 文件的/app
目录。
WORKDIR /app
:指定接下来的工作路径为/app
。
RUN npm install
:在/app
目录下,运行npm install
命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。这一行执行的命令实际是:
npm install --registry=https://registry.npm.taobao.org
因此,其他的依赖包也可以以类似的方式安装。
EXPOSE 3000/tcp
:将容器tcp 3000 端口暴露出来, 允许外部使用tcp连接这个端口。
如果想要生成的镜像产生容器后自动执行一些命令,可以在Dockerfile文件中添加以下内容:
CMD 完整命令
这样在容器启动后,以上命令就会自动执行。
另外,一个 Dockerfile 可以包含多个RUN
命令,但是只能有一个CMD
命令。
docker image build -t image文件名 .
.代表当前目录,这行命令意思是把当前目录下的内容通过Dockerfile文件的指示构建image文件,如果在当前目录下有不想要加入构建的部分,可以在构建之前新建.dockerignore文件,并在其中添加不想要加入构建的文件或目录名。
docker container run -p 8000:3000 -it 镜像名 /bin/bash
-p代表把容器的3000端口映射到本机的8000端口。
-it代表把容器的shell映射到当前shell。
容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。
首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。
$ docker login
接着,为本地的 image 标注用户名和版本。
$ docker image tag [imageName] [username]/[repository]:[tag] # 实例 $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
$ docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
$ docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。
vim /etc/default/docker
添加以下内容:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
参数 | 说明 |
---|---|
-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=[] | 从指定文件读入环境变量 |
–net="bridge" | 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 |
–link=[] | 添加链接到另一个容器 |
–expose=[] | 开放一个端口或一组端口 |
–volume , -v | 绑定一个卷,挂载到容器内 |
docker安装成功后会产生一个网卡,这个网卡默认采用bridge方式,这个网卡作为网关,没生成一个容器都会动态分配一个ip地址,这些ip地址之间可以相互通信,因而可以通过查看容器ip地址以实现容器之间的通信。
查看容器ip地址:
docker inspect 容器名或容器id
由于ip不稳定的,因此可以使用另一种方式完成容器之间的通信。
比如
docker run --name slave --link master:master -p 5506:3306 -v /usr/local/docker/mysql/slave/conf:/etc/mysql/conf.d -v /usr/local/docker/mysql/slave/logs:/var/log/mysql -v /usr/local/docker/mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
通过–link master:master可以指定容器名:别名,在使用的时候直接把容器ip地址换成别名即可。
docker run --dns 8.8.8.8 --name centos7 -dit centos:7 bash
docker run --net host --name centos7 -dit centos:7 bash
docker pull mysql:latest
[mysqld]
bind-address = 0.0.0.0
server-id = 1
log-bin = mysql-bin
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
sql_mode = TRADITIONAL
key_buffer_size = 16M
max_allowed_packet = 8M
default_authentication_plugin = mysql_native_password
在生成master容器前,由于生成时想要把mysql的配置文件目录绑定在容器内的一个目录下,因此先生成响应的文件并写入配置,之后再生成master容器,否则将无法登录。
在生成的时候,需要配置以下环境变量的其中一个:
docker run --name master -p 4406:3306 -v /usr/local/docker/mysql/master/conf:/etc/mysql/conf.d -v /usr/local/docker/mysql/master/logs:/var/log/mysql -v /usr/local/docker/mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
[mysqld]
bind-address = 0.0.0.0
server-id = 2
log-bin = mysql-bin
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
sql_mode = TRADITIONAL
key_buffer_size = 16M
max_allowed_packet = 8M
default_authentication_plugin = mysql_native_password
这里采用别名进行通信:
docker run --name slave --link master:master -p 5506:3306 -v /usr/local/docker/mysql/slave/conf:/etc/mysql/conf.d -v /usr/local/docker/mysql/slave/logs:/var/log/mysql -v /usr/local/docker/mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
创建slave用户,并赋予复制所有表和库的权限
CREATE USER 'slave'@'%' identified by 'passSlave';
grant replication slave on *.* to 'slave'@'%';
flush privileges;
这里的master_host可以为运行slave时为master容器link的别名,也可以是master容器的ip地址。master_log_file需要配置好master后使用show master status;
查看,
change master to master_host='master的ip地址',
master_user='slave',
master_password='passSlave',
master_log_file='mysql-bin.000003';
在主数据库中创建数据库,插入数据,然后在从数据库中查看即可。
添加以下源中的一个:
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
查看版本号
yum list docker-ce --showduplicates | sort -r
安装
yum -y install docker-ce-18.03.1.ce
使用systemctl开机自启
解决方式:
以特权模式运行容器
docker run -d --name centos7 --net host --privileged=true centos:7 /usr/sbin/init
由于挺久的了,只记得到肯定参考了阮一峰的博客内容,为此,我去翻了翻他的博客。
阮一峰的docker入门
同时欢迎访问我自己搭建的个人学习笔记,这个站点的一些笔记有些可能是没整理好的,很大原因是将来很长一段时间都不会花时间整理,所以就先放上面。
暂不欢迎访问我的个人博客,因为上面还没放可堪一放的文章。
这是以后可用于分享资源的站点,zfile是一个不错的github项目,因此我采用zfile搭建了这样一个关注于分享个人资源的站点。